Cod sursa(job #679086)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 12 februarie 2012 19:08:39
Problema Sate Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
#include<cstdio>
//#include<conio.h>
#define M 20000001
#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;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
      A(i,j,M);
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,u++;
else
      s[u].a=t->info,s[u].b=x,u++;
while(p<=u)
      {i=s[p].a,j=s[p].b,p++;
      //printf("d[%d][%d]=%d %d %d\n",i,j,B(i,j),c[i],c[j]);
      if(!c[i])
             o=i,c[i]=1;
      else
             if(!c[j])
                    o=j,c[j]=1;
             else
                    break;
      //printf("o=%d\n",o);
      for(t=l[o];t;t=t->next)
             {k=t->info;
             //printf("k=%d i=%d j=%d\n",k,i,j);
             if(!c[k])
                   {if(k<i)
                          {if(B(k,i)<M&&B(k,j)>B(i,j)+B(k,i))
                                 s[u].a=k,s[u].b=j,u++,A(k,j,B(i,j)+B(k,i));
                          else
                                 if(B(k,j)<M&&B(k,i)+B(i,j)>B(k,j))
                                       s[u].a=k,s[u].b=i,u++,A(k,i,B(k,j)-B(i,j));}             
                   else
                          if(k>i&&k<j)
                                 {if(B(i,k)<M&&B(k,j)>B(i,j)-B(i,k))
                                       s[u].a=k,s[u].b=j,u++,A(k,j,B(i,j)-B(i,k));
                                 else
                                       if(B(k,j)<M&&B(i,k)>B(i,j)-B(k,j))
                                              s[u].a=i,s[u].b=k,u++,A(i,k,B(i,j)-B(k,j));}
                          else
                                 if(k>j)
                                       {if(B(j,k)<M&&B(i,k)>B(i,j)+B(j,k))
                                              s[u].a=i,s[u].b=k,u++,A(i,k,B(i,j)+B(j,k));
                                       else
                                              if(B(i,k)<M&&B(j,k)+B(i,j)>B(i,k))
                                                      s[u].a=j,s[u].b=k,u++,A(j,k,B(i,k)-B(i,j));}}}}
fprintf(g,"%d",B(x,y));
//getch();
return 0;}