Cod sursa(job #133626)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 9 februarie 2008 12:10:06
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
# include <stdio.h>
# include <stdlib.h>

#define nmax 31000
#define mmax 100125

FILE*f=fopen("sate.in","r");
FILE*g=fopen("sate.out","w");

struct pelem {long info; pelem *next;};
pelem *sat[mmax],*dist[mmax];
long first,last,n,m,i,j,x,y,d,varf1,varf2;
unsigned char s[nmax];
long distanta[nmax],coada[nmax];

void push(pelem *&first, long vl)
{
 pelem *p;
 p=new pelem;
 p->info=vl;
 p->next=first;
 first=p;
}

void pop(pelem *&first, long &vl)
{
 pelem *p;
 vl=first->info;
 p=first;
 first=first->next;
 delete(p);
}

void qin(long vl)
{
 coada[last]=vl;
 last++;
}

void qout(long &vl)
{
 vl=coada[first];
 first++;
}

void bf(long start)
{
 long nod,varf,lung;
 s[start]=1;
 qin(start);
 while (first!=last)
   {
    qout(nod);
    while (sat[nod]!=NULL)
      {
       pop(sat[nod],varf);
       pop(dist[nod],lung);
       if (s[varf]==0)
         {
          s[varf]=1;
          qin(varf);
          if (nod<varf) distanta[varf]=distanta[nod]+lung;
                   else distanta[varf]=distanta[nod]-lung;
          if (varf==y) return;          
         }
      }
   }
}

int main()
{
 fscanf(f,"%ld %ld %ld %ld",&n,&m,&x,&y);
 for (i=1; i<=m; i++)
   {
    fscanf(f,"%ld %ld %ld",&varf1,&varf2,&d);
    push(sat[varf1],varf2);
    push(dist[varf1],d);
    push(sat[varf2],varf1);
    push(dist[varf2],d);
   }
 first=1; last=1;
 bf(x);
 fprintf(g,"%ld",abs(distanta[y]));
 return 0;
}