Cod sursa(job #1692762)

Utilizator ASTELOTudor Enescu ASTELO Data 21 aprilie 2016 16:40:25
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
vector<int> v[50001],vc[50001];
struct eu{int x,y;};
eu nod;
priority_queue<pair<int,int > > pq;
int n,m,i,j,k,x,y,val,vec[50001],t,qq,vc1[50001];
int main ()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&t);
for(qq=1;qq<=t;qq++)
	{
	int sursa;
	scanf("%d%d%d",&n,&m,&sursa);
	for(i=1;i<=n;i++)
		scanf("%d",&vc1[i]);
	for(i=1;i<=n;i++)
		vec[i]=1000000000;
	for(i=1;i<=n;i++)
		{
		while(!v[i].empty())
			{
			vc[i].pop_back();
			v[i].pop_back();
			}
		}
	for(i=1;i<=m;i++)
		{
		scanf("%d%d%d",&x,&y,&val);
		v[x].push_back(y);
		v[y].push_back(x);
		vc[x].push_back(val);
		vc[y].push_back(val);
		}
	vec[sursa]=0;
	pq.push(make_pair(0,sursa));
	while(!pq.empty())
		{
		int pp=0;
		if(-pq.top().first==vec[pq.top().second])
			{
			pp=1;
			nod.x=vec[pq.top().second];
			nod.y=pq.top().second;
			pq.pop();
			for(i=0;i<v[nod.y].size();i++)
				if(vec[v[nod.y][i]]>nod.x+vc[nod.y][i])
					{
					vec[v[nod.y][i]]=nod.x+vc[nod.y][i];
					pq.push(make_pair(-vec[v[nod.y][i]],v[nod.y][i]));
					}
			}
		if(pp==0)
			pq.pop();
		}
	int pp=0;
	for(i=1;i<=n;i++)
		{
		if(vec[i]==1000000000)
			vec[i]=0;
		if(vec[i]!=vc1[i])
			{
			pp=1;
			break;
			}
		}
	if(pp==0)
		printf("DA\n");
	else
		printf("NU\n");
	}
return 0;
}