Cod sursa(job #140456)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 21 februarie 2008 21:18:49
Problema Distante Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
//1-contoare,
#include <string.h>
#include <stdio.h>
#define INF 200000000
#define M 100000
#define N 50000
long muc[2*M+2][3];
long mp[N+1],varf;
FILE *fin,*fout;

long n,m;
long cost[N+1],flag[N+1],costi[N+1];
void appnod(long,long,long);

void dij(long gnod)
{long pl;
 long i,j,min,imin;
 cost[gnod]=0;
 for (i=0;i<n-1;i++)
 {for (imin=0,min=INF,j=1;j<=n;j++)
  {if(flag[j]==0&&min>cost[j])
   {min=cost[j];imin=j;
   }
  }
  flag[imin]=1;
  for(pl=mp[imin];pl!=0;pl=muc[pl][2])
  {if(flag[muc[pl][0]]==0&&cost[muc[pl][0]]>cost[imin]+muc[pl][1])
   {cost[muc[pl][0]]=cost[imin]+muc[pl][1];
   }
  }
 }
}
long compar()
{long i,flag=1;
 for (i=1;i<=n;i++)
 {if(costi[i]!=cost[i])
  {flag=0;break;}
 }
 if(flag)
 {return 1;}
 else 
  return 0;
}


void citire()
{long i,a,b,c,s;
 fscanf(fin,"%ld%ld%ld",&n,&m,&s);
 memset(mp,0,sizeof(mp));
 memset(muc,0,sizeof(muc));
 varf=1;
 for (i=1;i<=n;i++)
 {fscanf(fin,"%ld",&costi[i]);
 }
 for (i=0;i<m;i++)
 {fscanf(fin,"%ld%ld%ld",&a,&b,&c);
  appnod(a,b,c);
 }
 for (i=1;i<=n;i++)
 {cost[i]=INF;}
 memset(flag,0,sizeof(flag));
 dij(s);

 if(compar())
 fprintf(fout,"DA\n");

 else 
 fprintf(fout,"NU\n");
}

void appnod(long a,long b,long c)
{muc[varf][0]=b;
 muc[varf][1]=c;
 muc[varf][2]=mp[a];
 mp[a]=varf;
 varf++;

 muc[varf][0]=a;
 muc[varf][1]=c;
 muc[varf][2]=mp[b];
 mp[b]=varf;
 varf++;
}

int main ()
{varf=1;
 long i,t;
 fin=fopen("distante.in","r");
 fout=fopen("distante.out","w");
 fscanf(fin,"%ld",&t);
 for (i=0;i<t;i++)
 {citire();
 }
 fclose(fout);
 return 0;
}