Cod sursa(job #3355147)

Utilizator Cata20Draghici Catalina Cata20 Data 21 mai 2026 21:05:16
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>

using namespace std;

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

const int INF = 1e9;

void solve() {
	int n, m, s;
	fin >> n >> m >> s;
	vector<int> D(n + 1);
	for (int i = 1; i <= n; i++) {
		fin >> D[i];
	}
	vector<vector<pair<int, int>>> adj(n + 1);
	for (int i = 1; i <= m; i++) {
		int x, y, c;
		fin >> x >> y >> c;
		adj[x].push_back({y, c});
	}
	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
	vector<int> dist(n + 1, INF);
	dist[s] = 0;
	pq.push({dist[s], s});
	while(!pq.empty()) {
		int d = pq.top().first;
		int node = pq.top().second;
		pq.pop();

		if (d > dist[node]) continue;

		for (const auto& edge : adj[node]) {
			int neigh = edge.first;
			int c = edge.second;

			if (dist[node] + c < dist[neigh]) {
				dist[neigh] = dist[node] + c;
				pq.push({dist[neigh], neigh});
			}
		}
	}

	for (int i = 1; i <= n; i++) {
		if (D[i] != dist[i]) {
			fout << "NU" << '\n';
			return;
		}
	}
	fout << "DA" << '\n';
}

int main() {
	int t;
	fin >> t;
	while (t) {
		t--;
		solve();
	}
	return 0;
}