Cod sursa(job #694256)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 27 februarie 2012 19:33:05
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<cstdio>
#include<vector>
#include<bitset>
#include<deque>
using namespace std;
bitset<50010> in_q;
vector<pair<int,int> >V[50010];
deque<int> Q;
void read(),solve(),Bellman_Ford();
int T,N,M,A,ok,i,x,y,c,DIST[50010],Z[50010],X;
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	scanf("%d",&T);
}
void solve()
{
	for(;T;--T)
	{
		scanf("%d%d%d",&N,&M,&A);
		ok=1;
		for(i=1;i<=N;i++)
		{
			scanf("%d",&Z[i]);
			V[i].resize(0);
		}
		for(;M;--M)
		{
			scanf("%d%d%d",&x,&y,&c);
			V[x].push_back(make_pair(y,c));
		}
		in_q=0;
		memset(DIST,555,sizeof(DIST));
		DIST[A]=0;
		Bellman_Ford();
		for(i=1;i<=N;i++)if(Z[i]!=DIST[i]){ok=0;break;}
		if(ok)printf("DA\n"); else printf("NU\n");
	}
}
void Bellman_Ford()
{
	Q.resize(0);
	Q.push_back(A);
	in_q[A]=1;
	for(;!Q.empty();)
	{
		X=Q.front();
		for(vector<pair<int,int> >::iterator it=V[X].begin();it!=V[X].end();it++)
			if(DIST[it->first]>DIST[X]+it->second)
			{
				DIST[it->first]=DIST[X]+it->second;
				if(!in_q[it->first])
				{
					Q.push_back(it->first);
					in_q[it->first]=1;
				}
			}
		in_q[X]=0;
		Q.pop_front();
	}
}