Cod sursa(job #199288)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 17 iulie 2008 20:24:44
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<stdio.h>
#include<limits.h>

#define INF INT_MAX/2-1
#define NMAX 50000 //50
#define MMAX 10000 //100

struct muchie{unsigned short a,b,c;};

int main(){
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int n,m,i,j,k,t,nrt,ok,nrsel,gata,min;
muchie w[MMAX];
int o[NMAX+1],d[NMAX+1];
unsigned short s[NMAX+1],x,y,start;
int c[NMAX+1][NMAX+1];
scanf("%d",&t);
for(nrt=0;nrt<t;++nrt){
	scanf("%d%d%hu",&n,&m,&start);
	for(i=1;i<=n;++i) scanf("%d",&o[i]);
	for(i=0;i<m;++i) scanf("%hu%hu%hu",&w[i].a,&w[i].b,&w[i].c);
	for(i=1;i<=n;++i)
		for(j=1;j<=n;++j) c[i][j]=INF;
	for(i=1;i<=n;++i) c[i][i]=0;
	for(i=0;i<m;++i){
		x=w[i].a;y=w[i].b;
		c[x][y]=w[i].c;
		}
	for(i=1;i<=n;++i){
		s[i]=0;
		d[i]=c[start][i];
		}
	s[start]=1;nrsel=1;
	gata=0;k=0;
	do{
		min=INF+INF;
		for(i=1;i<=n;++i)
			if(!s[i]&&d[i]<min){
				min=d[i];k=i;
				}
		nrsel++;
		if(k&&(d[k]==INF||nrsel==n)) gata=1;
		else{
			s[k]=1;
			for(j=1;j<=n;++j)
				if(!s[j]&&d[j]>d[k]+c[k][j])
						d[j]=d[k]+c[k][j];
			}
		}while(!gata);

	for(i=1;i<=n;++i)
		if(d[i]==INF) d[i]=0;
	ok=1;
	for(i=1;i<=n&&ok;++i) ok=d[i]==o[i];
	ok?printf("DA\n"):printf("NU\n");
	}
return 0;
}