Cod sursa(job #72112)

Utilizator gigi_becaliGigi Becali gigi_becali Data 12 iulie 2007 19:46:03
Problema Distante Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
using namespace std;
#include <cstdio>
#include <vector>
#include <string>
#include <queue>
#define oo 0x3f3f3f3f
#define maxn 50001
#define pb push_back

struct nod { int n, c;nod(){}; nod(int a, int b){n=a; c=b;};};

vector<vector<nod> >a;
int d[maxn];
bool viz[maxn];

struct cmp{
	bool operator()(const int &a, const int &b)const
	{
		if(d[a]>d[b]) return 1;
		return 0;
	}
};

int n, m, d1[maxn],source;

void dijkstra()
{
	priority_queue<int, vector<int>, cmp>Q;
	memset(d, oo, sizeof(d));
	memset(viz, 0, sizeof(viz));
	d[source]=0;
	Q.push(source);
	vector<nod>::iterator i;
	int u;
	int nh=n;
	while(!Q.empty() && nh)
	{	
		u=Q.top();
		Q.pop();
		if(viz[u]) continue;
		--nh;
		viz[u]=1;
		for(i=a[u].begin();i!=a[u].end();++i)
			if(d[u]+i->c<d[i->n])
				d[i->n]=d[u]+i->c,
				Q.push(i->n);
	}
}

int main()
{
	int T,p, q, c,i;
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	scanf("%d\n", &T);
	while(T--)
	{
		scanf("%d %d %d\n",&n, &m, &source);
		a.clear();
		a.resize(n+1);
		for(i=1;i<=n;++i) scanf("%d ", d1+i);
		while(m--)
		{
			scanf("%d %d %d\n", &p, &q, &c);
			a[p].pb(nod(q, c));
			a[q].pb(nod(p, c));
		}
		dijkstra();
		int ok=1;
		for(i=1;i<=n;++i)
			if(d[i]!=d1[i]) { ok=0; break;}
		if(ok)printf("DA\n");
		else printf("NU\n");
	}
return 0;
}