Cod sursa(job #961737)

Utilizator antonioteoZait Teodor Antonio antonioteo Data 12 iunie 2013 19:31:08
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
#include <vector>
#define mp make_pair
#define x first
#define y second
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, ok;
bool OK[50001];
int d[50001];
vector < pair <int, int> > v[50001];
vector < pair <int, int> > :: iterator it;
int check(int x){
	for (int k = 1; k <= x; ++k) 
		if (!OK[k] && k != S) return 0;
	return 1;
}
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[a].push_back(mp(b, c));
			v[b].push_back(mp(a, c));
		}
		ok = 1;
		for (i = 1; i <= N; ++i) OK[i] = 0;
		if (d[S] != 0) continue;
		for (i = 1; i <= N && ok; ++i){
			it = v[i].begin(); 
			for (; it != v[i].end() && ok; ++it){
				if (d[i] + it -> second < d[it -> first]){
					ok = 0;
				}
				else
					if (it -> first != S && d[i] + it -> second == d[it -> first]) OK[it -> first] = 1;
			}
		}
		if (ok && check(N)) fout << "DA\n";
		else
			fout << "NU\n";
	}
	return 0;
}