Cod sursa(job #1916000)

Utilizator flibiaVisanu Cristian flibia Data 8 martie 2017 23:34:59
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <bits/stdc++.h>
#define ll long long 
#define mp make_pair
#define pb push_back
#define st first
#define nd second 
#define pii pair <int, int>

using namespace std;

ifstream in("distante.in");
ofstream out("distante.out");

int sol[50100], d[50100], n, m, t, s, x, y, z; vector <pii> v[50100]; bool f; 
set <pii> h; pii k;

int main(){
	in >> t;
	while(t--){
		in >> n >> m >> s; f = 1;
		memset(sol, 0, sizeof(sol));
		for(int i = 1; i <= n; i++) d[i] = 2e9;
		d[s] = 0;
		for(int i = 1; i <= 50099; i++) v[i].clear();
		for(int i = 1; i <= n; i++) in >> sol[i];
		for(int i = 1; i <= m; i++){
			in >> x >> y >> z;
			v[x].pb(mp(y, z));
			v[y].pb(mp(x, z));
		}
		h.insert(mp(0, s));
		while(!h.empty()){
			k = *h.begin();
			h.erase(h.begin());
			for(auto it : v[k.nd])
				if(d[k.nd] + it.nd < d[it.st]){
					if(d[it.st] != 2e9) h.erase(h.find(mp(d[it.st], it.st)));
					d[it.st] = it.nd + d[k.nd]; 
					h.insert(mp(d[it.st], it.st));
				}
		}
		for(int i = 1; i <= n; i++) if(sol[i] != d[i]){
			f = 0; break;
		}
		out << (f ? "DA\n" : "NU\n");
	}
	return 0;
}