Cod sursa(job #88805)

Utilizator coderninuHasna Robert coderninu Data 4 octombrie 2007 09:45:53
Problema Sate Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#include <stdlib.h>
#define infile "sate.in"
#define outfile "sate.out"
#define nmax 301

int n, X, Y, *a;
long m, i, dist[nmax];
long *g[nmax], *b;


void readdata();
void writedata();
void solve();

int main()
{
 readdata();
 solve();
 writedata();
 return 0;
}

void readdata()
{
 int x, y;
 long z;
 freopen(infile, "r", stdin);
 scanf("%d %ld %d %d\n", &n, &m, &X, &Y);
 a=new int [m+1];
 b=new long [m+1];
 for (i=1; i<=n; i++)
      g[i]=(long *)calloc(1,sizeof(long));
 for (i=1; i<=m; i++)
     {
      scanf("%d %d %ld\n", &x, &y, &z);
      g[x]=(long *)realloc(g[x], (g[x][0]+1)*sizeof(long));
      g[x][++g[x][0]]=i;
      a[i]=y;
      b[i]=z;
     }
 fclose(stdin);
}

void writedata()
{
 freopen(outfile, "w", stdout);
 printf("%ld\n", dist[Y]);
 fclose(stdout);
}

void solve()
{
 int x;
 long p, u, *q;
 q=new long [m+1];
 q[1]=X;
 p=u=1;
 while (p<=u)
     {
      x=q[p++];
      for (i=1; i<=g[x][0]; i++)
	  {
	   if (x<a[g[x][i]])
	       dist[a[g[x][i]]]=dist[x]+b[g[x][i]];
	   else
	       dist[a[g[x][i]]]=dist[x]-b[g[x][i]];
	   if (dist[Y]) return;
	   q[++u]=a[g[x][i]];
	  }
     }
}