Cod sursa(job #521889)

Utilizator dacyanMujdar Dacian dacyan Data 13 ianuarie 2011 18:35:07
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 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<vector<pair<int,int> > > G;
vector<int> d,  sol;
vector<bool> s;

void Dijkstra(int S, vector<int>);
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);
		
	}
	fin.close();
	fout.close();
	return 0;
}

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

void Dijkstra(int S, vector<int> d)
{
	
	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));
			}
		}
	}
	
	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";
}