Cod sursa(job #1533235)

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

struct muc{
	int surs, dest, cost; };

bool check_dist(const 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(const auto x : graf){
		if(de_verificat[x.surs] + x.cost == de_verificat[x.dest]){
			verificat[x.dest] = true; }
		if(de_verificat[x.surs] + x.cost < de_verificat[x.dest]){
			return false; } }

	return accumulate(begin(verificat), end(verificat), true, logical_and<bool>()); }

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<muc> graf(m);
	for(int i = 0, a, b, c; i < m; ++i){
		f >> graf[i].surs >> graf[i].dest >> graf[i].cost;
		--graf[i].surs, --graf[i].dest; }

	if(check_dist(graf, de_verificat, s)){
		g << "DA\n"; }
	else{
		g << "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; }