Cod sursa(job #2381096)

Utilizator agrici001a1Mihai A001 agrici001a1 Data 16 martie 2019 00:14:25
Problema Sate Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<cstdio>
#define N 30001
typedef struct nod
{int info,cost;
struct nod *next;}Nod;
struct P
{int a,b;};
P s[N];
Nod *l[N],*t;
int i,n,m,x,y,j,p,u,c[N],k,o;
 
void A(int i,int j,int k)
{Nod *p=new Nod;
p->info=j,p->cost=k,p->next=l[i],l[i]=p;}
 
int B(int i,int j)
{Nod *p;
for(p=l[i];p;p=p->next)
if(p->info==j)
      return p->cost;
return 0;}
 
int main()
{FILE *f=fopen("sate.in","r"),*g=fopen("sate.out","w");
fscanf(f,"%d%d%d%d",&n,&m,&x,&y),c[x]=1;
while(m--)
      fscanf(f,"%d%d%d",&i,&j,&k),A(i,j,k),A(j,i,-k);
for(t=l[x];t;t=t->next)
if(t->info>x)
      s[u].a=x,s[u++].b=t->info;
else
      s[u].a=t->info,s[u++].b=x;
while(p<=u)
      {if(c[y])
             break;
      i=s[p].a,j=s[p++].b,o=B(i,j);
      if(!c[i])
             for(t=l[i],c[i]=1;t;t=t->next)
             if(t->info<j)
                    s[u].a=t->info,s[u++].b=j,A(t->info,j,o-B(i,t->info));
             else
                    s[u].a=j,s[u++].b=t->info,A(j,t->info,B(i,t->info)-o);
      else
             if(!c[j])
                    for(t=l[j],c[j]=1;t;t=t->next)
                          s[u].a=i,s[u++].b=t->info,A(i,t->info,o+B(j,t->info));}
fprintf(g,"%d",B(x,y));
return 0;}