Cod sursa(job #796835)

Utilizator fhandreiAndrei Hareza fhandrei Data 12 octombrie 2012 18:57:15
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
// Include
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

// Definitii
#define edge pair<int, int>
#define cost first
#define node second

#define pb push_back
#define mp make_pair

// Constante
const int sz = 50000;
const int oo = (1<<30)-1;

// Variabile
ifstream in("distante.in");
ofstream out("distante.out");

int tests;
int nodes, edges, startNode;
int dist[sz], initDist[sz];

vector<edge> graph[sz];
vector<edge>::iterator it, end;
priority_queue<edge> heap;

// Main
int main()
{
	in >> tests;
	for(int test=1 ; test<=tests ; ++test)
	{
		if(test>1)
		{
			for(int i=1 ; i<=nodes ; ++i)
				graph[i].clear();
			while(!heap.empty())
				heap.pop();
		}
		
		in >> nodes >> edges >> startNode;
		for(int i=1 ; i<=nodes ; ++i)
			in >> initDist[i], dist[i] = oo;
		int rFrom, rTo, rCost;
		for(int i=1 ; i<=nodes ; ++i)
		{
			in >> rFrom >> rTo >> rCost;
			graph[rFrom].pb(mp(rCost, rTo));
			graph[rTo].pb(mp(rCost, rFrom));
		}
		
		dist[startNode] = 0;
		heap.push(mp(0, startNode));
		
		while(!heap.empty())
		{
			edge current = heap.top();
			heap.pop();
			
			end = graph[current.node].end();
			for(it=graph[current.node].begin(); it!=end ; ++it)
				if(current.cost + it->cost < dist[it->node])
				{
					dist[it->node] = current.cost + it->cost;
					heap.push(mp(dist[it->node], it->node));
				}
		}
		bool correct = true;
		for(int i=1 ; i<=nodes ; ++i)
			if(dist[i] != initDist[i])
			{
				correct=false;
				break;
			}
		out << (correct? "DA":"NU") << '\n';
	}
	
	in.close();
	out.close();
	return 0;
}