Cod sursa(job #685520)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 20 februarie 2012 23:23:13
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include<cstdio>
#include<cstring>
#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;
char r[100];
int i,n,m,x,y,j,p,u,c[N],k,o,q,v[5],e;

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");
fgets(r,100,f);
q=strlen(r)-1;
for(i=0;i<q;i++)
if(r[i]>='0'&&r[i]<='9')
      v[o]=v[o]*10+(r[i]-'0');
else
      o++;
n=v[0],m=v[1],x=v[2],y=v[3],c[x]=1;
while(m--)
      {v[0]=v[1]=v[2]=0;
      fgets(r,100,f);
      q=strlen(r)-1,o=0;
      for(e=0;e<q;e++)
      if(r[e]>='0'&&r[e]<='9')
            v[o]=v[o]*10+(r[e]-'0');
      else
            o++;
      A(v[0],v[1],v[2]),A(v[1],v[0],-v[2]);}
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)
      {i=s[p].a,j=s[p++].b,e=B(i,j);
      if(c[y])
             break;
      if(!c[i])
             o=i,c[i]=1;
      else
             {if(!c[j])
                    o=j,c[j]=1;}
      for(t=l[o];t;t=t->next)
             {k=t->info;
             if(!c[k])
                   if(k<i)
                          if(B(k,i))
                                 s[u].a=k,s[u++].b=j,A(k,j,e+B(k,i));
                          else
                                 s[u].a=k,s[u++].b=i,A(k,i,B(k,j)-e);             
                   else
                          if(k>i&&k<j)
                                 if(B(i,k))
                                       s[u].a=k,s[u++].b=j,A(k,j,e-B(i,k));
                                 else
                                       s[u].a=i,s[u++].b=k,A(i,k,e-B(k,j));
                          else
                                 if(k>j)
                                       if(B(j,k))
                                              s[u].a=i,s[u++].b=k,A(i,k,e+B(j,k));
                                       else
                                              s[u].a=j,s[u++].b=k,A(j,k,B(i,k)-e);}}
fprintf(g,"%d",B(x,y));
return 0;}