Cod sursa(job #199357)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 18 iulie 2008 08:21:14
Problema Distante Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include<stdio.h>
#include<limits.h>

#define INF INT_MAX/2-1
#define NMAX 4000
#define MMAX 100000

struct muchie{unsigned short a,b,c;};
int c[NMAX+1][NMAX+1];

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]={0},d[NMAX+1]={0};
unsigned short /*s[NMAX+1]={0},*/x,y,start;
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]=c[y][x]=w[i].c;
		}
	for(k=1;k<=n;++k)
		for(i=1;i<=n;++i)
		if(i!=k)
			for(j=1;j<=n;++j)
				if(j!=i&&j!=k)
					if(c[i][j]>c[i][k]+c[k][j])
						c[i][j]=c[i][k]+c[k][j];

	for(i=1;i<=n;++i){
		d[i]=c[start][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;
}