Cod sursa(job #2698687)

Utilizator SenoritaMadalina Chirpicinic Senorita Data 22 ianuarie 2021 20:15:54
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>
#define fx first
#define sx second
#define pb push_back
typedef long long ll;
const int Max = 50006;
const int Inf = 2e9;
const int MOD = 666013;
using namespace std;

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

int n, m, start, x, y, z, aux[Max], viz[Max], dist[Max];
vector < pair<int,int> > v[Max];

void dijkstra (int st) {
	dist[st] = 0; viz[st] = 0;
	for (int i=1; i<=n; i++) {
		if (i == st) continue;
		dist[i] = Inf;
		viz[i] = 0;
	}
	priority_queue < pair<int,int> > q;
	q.push({0, st});
	while (q.size()) {
		int node = q.top().sx;
		q.pop();
		if (viz[node]) continue;
		viz[node] = 1;
		for (int i=0; i<v[node].size(); i++) {
			int next = v[node][i].fx, w = v[node][i].sx;
			if (dist[node] + w < dist[next]) {
				dist[next] = dist[node] + w;
				q.push({-dist[next], next});
			}
		}
	}
	return;
}

void solve () {
	in >> n >> m >> start;
	for (int i=1; i<=n; i++) in >> aux[i], v[i].clear();
	while (m--) {
		in >> x >> y >> z;
		v[x].pb({y, z});
		v[y].pb({x, z});
	}
	dijkstra(start);
	bool ans = true;
	for (int i=1; i<=n; i++) if (aux[i] != dist[i]) {
		ans = false;
		break;
	}
	(ans == true) ? out << "DA\n" : out << "NU\n";
	return;
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int t;
	in >> t;
	while (t--) {
		solve ();
	}
	return 0;
}