Cod sursa(job #1101396)

Utilizator alexandru70Ungurianu Alexandru alexandru70 Data 8 februarie 2014 13:48:32
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <limits>

using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");

typedef vector<unsigned> vec_u;
typedef pair<unsigned,unsigned> pair_u;
typedef vector<pair_u> vec_pair_u;
typedef vector<bool> vec_b;

const unsigned INF = numeric_limits<unsigned>::max();

class Graph {

public:
	Graph(size_t n) :
		nNodes(n)
	{
		adLs.resize(n);
	}

	void addEdge(unsigned from, unsigned to, unsigned cost) {
		adLs[from].push_back(pair_u(to,cost));
	}

	size_t getNNodes() {
		return nNodes;
	}

	vector<vec_pair_u> adLs;
	size_t nNodes;
};

bool isGood(Graph g, vec_u dists, unsigned src) {
	if(dists[src]!=0)return false;
	vec_b hasDist(dists.size(),false);
	for(size_t i = 0; i < g.nNodes; ++i) {
		for(auto &pr:g.adLs[i]) {
			if(dists[i]+pr.second < dists[pr.first])
				return false;
			if(dists[i]+pr.second == dists[pr.first])
				hasDist[pr.first] = true;
		}
	}
	// for(size_t i = 0; i < hasDist.size(); ++i){
	// 	if(!hasDist[i])return false;
	// }
	return true;
}

int main() {
	size_t t;
	in >> t;
	while(t--) {
		size_t n,m;
		unsigned s;
		in >> n >> m >> s;

		Graph g(n);

		vec_u bDists(n);
		for(size_t i = 0; i < n; ++i)
			in >> bDists[i];

		for(size_t i = 0; i < m; ++i) {
			unsigned a,b,c;
			in >> a >> b >> c;
			g.addEdge(a-1,b-1,c);
			g.addEdge(b-1,a-1,c);
		}
		if(isGood(g,bDists,s-1)) 
			out << "DA\n";
		else
			out << "NU\n";
	}
}