Cod sursa(job #713407)

Utilizator ms-ninjacristescu liviu ms-ninja Data 14 martie 2012 17:02:23
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
#define dim 50005
#define inf 0x3f3f3f3f
vector <pair <int,int> > v[dim];
int viz[dim], d[dim], check[dim],n , m, start;

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

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

void read()
{
	int i, a, b, c;
	fin>>n >>m >>start;
	for(i=1;i<=n;++i)
		fin>>check[i];
	for(i=1;i<=m;++i)
	{
		fin>>a >>b >>c;
		v[a].push_back(make_pair(b,c));
		v[b].push_back(make_pair(a,c));
	}
}

void dijkstra(int nod)
{
	memset(d,inf,sizeof(d));
	d[nod]=0;
	Heap.push(nod);
	
	while(!Heap.empty())
	{
		int re=Heap.top();
		Heap.pop();
		viz[re]=0;
		for(int k=0;k<v[re].size();++k)
			if(d[re]+v[re][k].second<d[v[re][k].first])
			{
				d[v[re][k].first]=d[re]+v[re][k].second;
				if(viz[v[re][k].first]==0)
				{
					viz[v[re][k].first]=1;
					Heap.push(v[re][k].first);
				}
			}
	}
}

void solve()
{
	int i,ok=1;
	for(i=1;i<=n;++i)
		if(check[i]!=d[i])
		{ok=0;break;}
	
		if(ok==0)
			fout<<"NU\n";
		else
			fout<<"DA\n";
}


int main()
{
	int t;
	fin>>t;
	for(;t;--t)
	{
		read();
		dijkstra(start);
		solve();
	}
	
	return 0;
}