Cod sursa(job #23601)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 1 martie 2007 01:34:48
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <stdio.h>
#include <stdlib.h>
//#include <malloc.h> //
#include <string.h>
//#include <mem.h> //
#define fin  "distante.in"
#define fout "distante.out"
#define Nmax 50001 //
#define Mmax 100001 //

int T,N,M,*G[Nmax],*C[Nmax],Deg[Nmax];
int s,viz[Nmax],st[Nmax],d[Nmax],p[Nmax],good;

void check() {
int i,j,x,y,c,st2[Nmax];

	st2[0]=0;
	for (i=1;i<=st[0];++i) {

		x=st[i];

		for (j=0;j<Deg[x];++j) {

			y=G[x][j];
			c=C[x][j];

			if (d[x]+c<d[y]) good=0;
			if (d[x]+c==d[y]) p[y]=1;
			if (!viz[y])
				st2[++st2[0]]=y;
			viz[y]=1;
		}

		if (!good) return ;
	}
	
	for (i=0;i<=st2[0];++i) st[i]=st2[i];

	if (st[0]) check();

}

int main() {
int i,x,y,c,list[Mmax][3];

	freopen(fin,"r",stdin); freopen(fout,"w",stdout);

	scanf("%i",&T);

	for (;T>0;--T) {
		scanf("%i%i%i",&N,&M,&s);
		memset(viz,0,(N+1)*sizeof(int));
		memset(Deg,0,(N+1)*sizeof(int));
		memset(p,0,(N+1)*sizeof(int));

		for (i=1;i<=N;++i) scanf("%i",&d[i]);

		for (i=1;i<=M;++i) {

			scanf("%i%i%i",&list[i][0],&list[i][1],&list[i][2]);
			Deg[list[i][0]]++;
			Deg[list[i][1]]++;
		}

		for (i=1;i<=N;++i) {
			G[i]=(int*)malloc(Deg[i]*sizeof(int));
			C[i]=(int*)malloc(Deg[i]*sizeof(int));
			Deg[i]=0;
		}

		for (i=1;i<=M;++i) {
			x=list[i][0]; y=list[i][1];
			c=list[i][2];

			G[x][Deg[x]]=y;
			C[x][Deg[x]++]=c;

			G[y][Deg[y]]=x;
			C[y][Deg[y]++]=c;

		}

		//for (i=1;i<=N;++i){
		//for (x=0;x<Deg[i];++x) printf("%i ",C[i][x]);
		//printf("\n");   }

		good=1;  viz[s]=1; p[s]=1;
		st[0]=1; st[1]=s;
		check();

		if (d[s]!=0) good=0;

		for (i=1;i<=N;++i)
			if (p[i]==0) good=0;

		if (good) printf("DA\n");

		else printf("NU\n");

	}

	fclose(stdin); fclose(stdout);

	return 0;
}