Cod sursa(job #1533223)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 22 noiembrie 2015 11:57:59
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

struct muc{
	int dest, cost; };

bool check_dist(const vector<vector<muc> >& graf, const vector<int>& de_verificat, const int surs){
	const int n = graf.size();
	vector<bool> verificat(n, false);

	if(de_verificat[surs] != 0){
		return false; }
	verificat[surs] = true;

	for(int cur = 0; cur < n; ++cur){
		for(const auto next : graf[cur]){
			if(de_verificat[next.dest] > de_verificat[cur] + next.cost){
				return false; }
			if(de_verificat[next.dest] == de_verificat[cur] + next.cost){
				verificat[next.dest] = true; } } }
	return all_of(begin(verificat), end(verificat), [](const bool b){ return b; }); }

void do_test(ifstream& f, ofstream& g){
	int n, m, s;
	f >> n >> m >> s;
	--s;

	vector<int> de_verificat(n);
	for(auto& x : de_verificat){
		f >> x; }

	vector<vector<muc> > graf(n);

	for(int i = 0, a, b, c; i < m; ++i){
		f >> a >> b >> c;
		--a, --b;
		graf[a].push_back((muc){b, c}); }

	g << (check_dist(graf, de_verificat, s) ? "DA\n" : "NU\n"); }

int main(){
	ifstream f("distante.in");
	ofstream g("distante.out");
	int t;
	f >> t;
	for(int i = 0; i < t; ++i){
		do_test(f, g); }
	return 0; }