Cod sursa(job #140398)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 21 februarie 2008 20:35:28
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
//1-contoare,
#include <string.h>
#include <stdio.h>
#define INF 2000000000
#define N 50000
struct nod
{long gnod;
 long gcost;
 nod *urm;
};

FILE *fin,*fout;
nod *varf,*mp[N+1];
long n,m;
long cost[N+1],flag[N+1],costi[N+1];

void appnod(long,long,long);
void dij(long gnod)
{nod *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!=NULL;pl=pl->urm)
  {if(flag[pl->gnod]==0&&cost[pl->gnod]>cost[imin]+pl->gcost)
   {cost[pl->gnod]=cost[imin]+pl->gcost;
   }
  }
 }
}
int compar()
{int 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 sterge()
{nod *pl=varf;
 while(pl)
 {varf=varf->urm;
  delete pl;
  pl=varf;
 }
}

void citire()
{long i,a,b,c,s;
 fscanf(fin,"%d%d%d",&n,&m,&s);
 sterge();
 for (i=0;i<N+1;i++)
 {mp[i]=NULL;}
 for (i=1;i<=n;i++)
 {fscanf(fin,"%d",&costi[i]);
 }
 for (i=0;i<m;i++)
 {fscanf(fin,"%d%d%d",&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 ");

 else 
 fprintf(fout,"NU ");
}

void appnod(long a,long b,long c)
{nod* p=new nod;
 p->gnod=a;
 p->gcost=c;
 p->urm=mp[b];
 mp[b]=p;

 p=new nod;
 p->gnod=b;
 p->gcost=c;
 p->urm=mp[a];
 mp[a]=p;
}
int main ()
{varf=NULL;
 int i,t;
 fin=fopen("distante.in","r");
 fout=fopen("distante.out","w");
 fscanf(fin,"%d",&t);
 for (i=0;i<t;i++)
 {citire();
 }
 fclose(fout);
 return 0;
}