Cod sursa(job #365194)

Utilizator mihaionlyMihai Jiplea mihaionly Data 18 noiembrie 2009 07:30:48
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <stdio.h>
#include <vector>
using namespace std;
#define Mmax 100001
#define inf 1<<30
int n,m,s,t,x[Mmax],y[Mmax];
long c[Mmax],dx[Mmax/2+1],d[Mmax/2];
FILE *f=fopen("distante.in","r");
FILE *g=fopen("distante.out","w");
void read()
 {
 int i;
 fscanf(f,"%d %d %d",&n,&m,&s);
 m*=2;
 for(i=1;i<=n;++i) {  fscanf(f,"%ld",&dx[i]);  d[i]=inf;  }
 for(i=1;i<=m;i+=2)
  {
  fscanf(f,"%d %d %ld",&x[i],&y[i],&c[i]);
  y[i+1]=x[i];
  x[i+1]=y[i];
  c[i+1]=c[i];
  if(x[i]==s)
   d[y[i]]=c[i];
  if(x[i+1]==s)
   d[y[i+1]]=c[i+1];
  }
 d[s]=0;
 } 
void solve()
 {
 bool ok=true;
 int i;
 while(ok)
  {
  ok=false;
  for(i=1;i<=m;++i)
   {
   if(d[y[i]]>d[x[i]]+c[i])
    {	
	d[y[i]]=d[x[i]]+c[i];
	ok=true;
    }
   }
  }
 }
void show()
 {
 
 int i;
 for(i=1;i<=n;++i)
  if(!(d[i]==dx[i]||(dx[i]==0&&d[i]==inf)))
   {
   fprintf(g,"NU\n");
   return;
   }
 fprintf(g,"DA\n");
 }
int main()
 {
 fscanf(f,"%d",&t);
 while(t)
 {
 read();
 solve();
 show();
 --t;
 }
 return 0;	 
 }