Cod sursa(job #961750)

Utilizator antonioteoZait Teodor Antonio antonioteo Data 12 iunie 2013 19:57:52
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <fstream>
#include <vector>
using namespace std;
const char iname[] = "distante.in";
const char oname[] = "distante.out";
ifstream fin(iname);
ofstream fout(oname);
int T, N, M, S, i, j, a, b, c, oke;
int d[50001];
bool viz[50001];
int check(int X){
	for (int k = 1; k <= X; ++k)
		if (!viz[k] && k != S) return 0;
	return 1;
}
struct trip{int x, y, z; trip(){}; trip(int G, int H, int I){x = G; y = H; z = I;};};
vector < trip > v;
vector < trip > :: iterator it;
int main(){
	fin >> T;
	while (T--){
		fin >> N >> M >> S;
		for (i = 1; i <= N; ++i) fin >> d[i];
		for (i = 1; i <= M; ++i){
			fin >> a >> b >> c;
			v.push_back(trip(a, b, c));
			v.push_back(trip(b, a, c));
		}
		oke = 1;
		for (i = 1; i <= N; ++i) viz[i] = false;
		if (d[S] != 0) continue;
		it = v.begin();
		for (; it != v.end() && oke; ++it){
			if (d[it -> x] + it -> z < d[it -> y]) oke = 0;
			else
				if (it -> x != S && d[it -> x] == d[it -> y] + it -> z) viz[it -> x] = true;
		}
		if (oke && check(N)) fout << "DA\n";
		else
			fout << "NU\n";
	}
	return 0;
}