Cod sursa(job #706196)

Utilizator netedu_andreiFII Andrei Netedu netedu_andrei Data 5 martie 2012 18:48:18
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<stdio.h>
#include<vector>
#include<queue>

using namespace std;

struct nod
{
	long x;
	long sum;
};

vector<nod> a[50001][10];
long s,ok,t,nr,x,y,c,n,m,i,vd[50001],dist[50001];
nod cod;

void rezolva(long t)
{
	queue<long> q;
	scanf("%ld %ld %ld",&n,&m,&s);
	for(i=1;i<=n;i++) scanf("%ld",&vd[i]);
	for(i=1;i<=m;i++)
	{
		scanf("%ld %ld %ld",&x,&y,&c);
		cod.sum=c;
		cod.x=y;
		a[x][t].push_back(cod);
	}
	for(i=1;i<=n;i++) dist[i]=500000000;
	dist[s]=0;
	q.push(s);
	while(!q.empty())
	{
		x=q.front();
		nr=a[x][t].size();
		for(i=0;i<nr;i++)
			if(dist[a[x][t][i].x]>dist[x]+a[x][t][i].sum)
			{
				dist[a[x][t][i].x]=dist[x]+a[x][t][i].sum;
				q.push(a[x][t][i].x);
			}
		q.pop();
	}
	ok=1;
	for(i=1;i<=n;i++) 
	{
		if(dist[i]==500000000) dist[i]=-1;
		if(dist[i]!=vd[i])
		{
			ok=0;
			break;
		}
	}
	if(ok==1) printf("DA\n");
	else printf("NU\n");
}
	
int main()
{
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	scanf("%ld",&t);
	for(t=t;t>=1;t--) rezolva(t);
	return 0;
}