Cod sursa(job #416195)

Utilizator funkydvdIancu David Traian funkydvd Data 12 martie 2010 12:47:05
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<fstream>
#include<vector>
#include<algorithm>
#include<queue>
#define MAXN 50005
using namespace std;
const int inf=2000000;
int d[MAXN],n,m,s,dist[100001];
vector< pair<int, int> > G[MAXN];
ifstream f("distante.in");
ofstream g("distante.out");
void solve();
int main()
{
	int t,nr,i,x,y,z,ok;
	f>>t;
	for (; t; t--)
	{
		f>>n>>m>>s;
		nr=1;
		memset (G,0,sizeof(G[0]));
		for (i=1;i<=n;i++) f>>dist[i];
		for(i=0;i<m;i++)
	    {	
			f>>x>>y>>z;
	        G[x].push_back(make_pair(y,z));
			G[y].push_back(make_pair(x,z));
		}
		solve();
		ok=1;
		for(i=1;i<=n;i++) if(d[i]!=dist[i]) ok=0;
	    if (ok) g<<"DA\n";
		  else g<<"NU\n";
	}
return 0;
}
void solve()
{
	bool InQueue[MAXN];
	queue<int> Q;
	memset(InQueue, false, sizeof(InQueue));
	for (int i=1; i<=n; i++) d[i]=inf;
	d[s] = 0;
	Q.push(s);
	InQueue[s] = true;
	while (!Q.empty()) 
	{
		int nod = Q.front();
		Q.pop();
		InQueue[nod] = false;
		for (vector< pair<int, int> >::iterator it = G[nod].begin(); it != G[nod].end(); ++it)
			if (d[nod] + it->second < d[it->first])			
			{
				d[it->first] = d[nod] + it->second;
				if (!InQueue[it->first])
				{
					Q.push(it->first);
					InQueue[it->first] = true;
				}
			}
	}
}