Cod sursa(job #180655)

Utilizator c_e_manuEmanuel Cinca c_e_manu Data 17 aprilie 2008 12:47:19
Problema Distante Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<stdio.h>
const long INF=1000001;
long m;
struct cost {unsigned x,y;
		int c;};
cost a[100001];
unsigned calcul(unsigned a, unsigned b);
int main()
{       int sw,t,ok,l;
	long i,j,n,p,min,k,s[50001],d[100001],aux[100001];
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	scanf("%ld",&t);
	for(l=1;l<=t;l++)
	{	scanf("%ld%ld%ld",&n,&m,&p);
		for(i=1;i<=n;i++)
		{	aux[i]=d[i]=s[i]=0;
			scanf("%ld",&aux[i]);
		}
		for(i=1;i<=m;i++)
			scanf("%ld%ld%ld",&a[i].x,&a[i].y,&a[i].c);
		for(i=1;i<=n;i++)
			if(i!=p)d[i]=calcul(p,i);
		s[p]=1;
		for(i=1;i<=n-1;i++)
		{	min=100001;
			for(j=1;j<=n;j++)
				if(s[j]==0)
					if(d[j]<min)
					{min=d[j];k=j;}
			s[k]=1;
			for(j=1;j<=n;j++)
				if(s[j]==0)
				{       sw=calcul(k,j);
					if(d[j]>d[k]+sw)
						d[j]=d[k]+sw;
				}
		}ok=1;
		for(i=1;i<=n&&ok;i++)
			if(d[i]!=aux[i]) ok=0;
		if(!ok)	printf("%s","NU\n");
		else	printf("%s","DA\n");
	}
	return 0;
}
unsigned calcul(unsigned f,unsigned g)
{	int i;
	for(i=1;i<=m;i++)
		if((a[i].x==f&&a[i].y==g)||(a[i].x==g&&a[i].y==f))
			return a[i].c;
	return INF;
}