Cod sursa(job #521888)

Utilizator dacyanMujdar Dacian dacyan Data 13 ianuarie 2011 18:30:39
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <set>
#include <vector>
#define DIM 50001
#define INF 0x3f3f3f3f
using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");

int n, t, m, sursa; 
vector<pair<int,int> > G[DIM];
int d[DIM], sol[DIM];
vector<bool> s;

void Dijkstra(int S, int d[DIM]);
void Clean();

int main()
{
	fin >> t;
	for (int p = 1; p <= t; ++p)
	{
		
		fin >> n >> m >> sursa;
		Clean();
		
		for (int i = 1; i <= n; ++i) 
		{
			fin >> sol[i];
			d[i] = INF;
		}
		int x, y, c;
		for (int i = 1; i <= m; ++i)
		{
			fin >> x >> y >> c;
			G[x].push_back(make_pair(c,y));
			G[y].push_back(make_pair(c,x));
		}
		
		Dijkstra(sursa, d);
		
		bool ok = true;
		for (int i = 1; i <= n && ok; ++i)
			if (sol[i] != d[i]) ok = false;
		if (ok) fout << "DA\n";
		else fout << "NU\n";
	}
	fin.close();
	fout.close();
	return 0;
}

void Clean()
{
	s.clear(); 
	s.resize(n+1); 
	for (int i = 1; i <= n; ++i) G[i].clear();
}

void Dijkstra(int S, int d[INF])
{
	
	set<pair<int,int> > Q;
	set<pair<int,int> >::iterator it;
	
	for (int i = 1; i <= n; ++i) d[i] = INF;
	d[1] = 0;
	
	Q.insert(make_pair(0,1));
	
	int x, val;
	while (!Q.empty())
	{
		it = Q.begin();
		val = it->first;
		x = it->second;
		Q.erase(it);
		for (int i = 0; i < G[x].size(); ++i)
		{
			int son = G[x][i].second;
			if ( d[son] > val + G[x][i].first)
			{
			//	s[son] = true;
				d[son] = val + G[x][i].first;
				Q.insert(make_pair(d[son], son));
			}
		}
	}
}