Cod sursa(job #67819)

Utilizator coderninuHasna Robert coderninu Data 25 iunie 2007 17:32:01
Problema Sate Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>
#define infile "sate.in"
#define outfile "sate.out"
#define nmax 300

struct bau {unsigned int ad, dis;} a[nmax][nmax/2];
unsigned int n, x, y, uz[nmax], c[nmax];
long m, i, dist[nmax], rez;

void readdata()
{
 FILE *fin=fopen(infile, "r");
 long daux;
 int x2, y2;
 fscanf(fin, "%d %ld %d %d\n", &n, &m, &x, &y);
 for (i=0; i<m; i++)
     {
      fscanf(fin, "%d %d %ld", &x2, &y2, &daux);
      a[x2][++a[x2][0].ad].ad=y2;
      a[x2][a[x2][0].ad].dis=daux;
      a[y2][++a[y2][0].ad].ad=x2;
      a[y2][a[y2][0].ad].dis=daux;
     }
}

long abs(long x)
{
 return x<0?-x:x;
}

long DFS(unsigned int x)
{
 int u=0;
 c[++u]=x;
 uz[x]=1;
 while (u)
     {
      x=c[u];
      for (i=a[x][a[x][0].ad+1].ad+1; i<=a[x][0].ad && uz[a[x][i].ad]; i++);
      a[x][a[x][0].ad+1].ad=i;
      if (i<=a[x][0].ad)
	  {
	   c[++u]=a[x][i].ad;
           uz[a[x][i].ad]=1;
	   if (x<a[x][i].ad)
	       dist[a[x][i].ad]=dist[x]+a[x][i].dis;
	   else
	       dist[a[x][i].ad]=dist[x]-a[x][i].dis;
	   if (a[x][i].ad == y) return abs(dist[y]);
	  }
      else
	  u--;
     }
 return 0;
}

void writedata()
{
 FILE *fout=fopen(outfile, "w");
 fprintf(fout, "%ld", rez);
 fclose(fout);
}

int main()
{
 readdata();
 rez=DFS(x);
 writedata();
 return 0;
}