Cod sursa(job #695327)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 28 februarie 2012 11:55:47
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<stdio.h>
#include<queue>
#include<string.h>
#include<algorithm>
#define pb push_back
#define Nmax 50009
#define nod first
#define cost second
#define mp make_pair
#define inf 0x3f3f3f3f

using namespace std;

int j,t,S,x,y,i,n,m,c,sol[Nmax],D[Nmax];
vector<pair<int,int> > a[Nmax];
vector<pair<int,int> >::iterator it;

struct cmp
{
	bool operator() (const int &x,const int &y)
	{
		return (D[x]>D[y]);
	}
};

priority_queue<int,vector<int>,cmp> Q;

int dijkstra(int start)
{
	memset(D,inf,sizeof(D));
	D[start]=0;
	Q.push(start);
	
	while (!Q.empty())
	{
		x=Q.top();
		for (it=a[x].begin();it!=a[x].end();it++)
			if (D[x]+(*it).cost<D[(*it).nod])
			{
				D[(*it).nod]=D[x]+(*it).cost;
				Q.push((*it).nod);
			}
		Q.pop();
	}
	for (int i=1;i<=n;i++) if (D[i]!=sol[i]) return 0;
	return 1;
}

int main()
{
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	
	scanf("%d",&t);
	
	for (j=1;j<=t;j++)
	{
		scanf("%d%d%d",&n,&m,&S);
		for (i=1;i<=n;i++)
		{
			a[i].clear();
			scanf("%d",&sol[i]);
		}
		
		for (i=1;i<=m;i++)
		{
			scanf("%d%d%d",&x,&y,&c);
			a[x].pb(mp(y,c));
			a[y].pb(mp(x,c));
		}
		
		if (dijkstra(S)) printf("DA\n");
			else printf("NU\n");
	}
}