Cod sursa(job #1692719)

Utilizator ASTELOTudor Enescu ASTELO Data 21 aprilie 2016 15:40:06
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 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<=m;i++)
	{
	scanf("%d%d%d",&x,&y,&val);
    v[x].push_back(y);
    vc[x].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)
		if(vec[i]!=vc1[i])
			{
			pp=1;
			break;
			}
	}
if(pp==0)
	printf("DA\n");
else
	printf("NU\n");
}
return 0;
}