Cod sursa(job #523181)

Utilizator feelshiftFeelshift feelshift Data 17 ianuarie 2011 11:52:43
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
// http://infoarena.ro/problema/distante
#include <fstream>
#include <vector>
using namespace std;

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

int nrGraphs;
int nodes,edges,startNode;
vector<int> dist;
vector<bool> canBeAchieved;

void solve();

int main() {
	in >> nrGraphs;
	dist.resize(50001);
	canBeAchieved.resize(50001);
	
	for(int step=1;step<=nrGraphs;step++) {
		in >> nodes >> edges >> startNode;
		
		solve();
	}
	
	in.close();
	out.close();
	
	return (0);
}

void solve() {
	int from,to,cost;
	bool ok = true;
	canBeAchieved.assign(nodes+1,false);
	
	for(int i=1;i<=nodes;i++)
		in >> dist.at(i);
	
	if(dist.at(startNode))
		ok = false;
	
	//if(ok)
		for(int i=1;i<=edges;i++) {
			in >> from >> to >> cost;
		
			// doua conditii fiindca graful e neorientat
			if(dist.at(from) + cost < dist.at(to) && dist.at(to) + cost < dist.at(from)) {
				ok = false;
				break;
			}
		
			// doua conditii fiindca graful e neorientat
			if(dist.at(from) + cost == dist.at(to))
				canBeAchieved.at(to) = true;
		
			if(dist.at(to) + cost == dist.at(from))
				canBeAchieved.at(from) = true;
		}
	
	//if(ok)
		for(int currentNode=1;currentNode<=nodes;currentNode++)
			if(currentNode != startNode)
				if(!canBeAchieved.at(currentNode)) {
					ok = false;
					break;
				}
	
	if(ok)
		out << "DA\n";
	else
		out << "NU\n";
}