Cod sursa(job #3290225)

Utilizator Alexutu008Ionita Alexandru-Dumitru Alexutu008 Data 29 martie 2025 15:37:00
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<bits/stdc++.h>

using namespace std;

vector<pair<int,int>> v[100001];

void solve() {

	int n, m, P;

	cin >> n >> m >> P;

	for (int i = 1; i <= n; ++i)
		v[i].clear();

	vector<int> dist(n + 1), D(n + 1);
	vector<bool> vis(n + 1);
	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;

	for (int i = 1; i <= n; ++i)
		cin >> D[i];
	for (int i = 1; i <= m; ++i) {
		int a, b, c;
		cin >> a >> b >> c;
		v[a].push_back({ b,c });
		v[b].push_back({ a,c });
	}

	pq.push({ 0, P });
	vis[P] = 1;
	dist[P] = 0;
	while (!pq.empty()) {
		int currdist = pq.top().first;
		int nod = pq.top().second;
		pq.pop();
		if (dist[nod] < currdist)
			continue;
		for (auto&& vecin : v[nod]) {
			if (!vis[vecin.first] || dist[vecin.first] > dist[nod] + vecin.second) {
				dist[vecin.first] = dist[nod] + vecin.second;
				vis[vecin.first] = 1;
				pq.push({ dist[vecin.first], vecin.first });
			}
		}
	}

	//for (int i = 1; i <= n; ++i)
		//cout << dist[i] << " ";
	//cout << "\n";

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

}

int main() {
	freopen("distante.in", "r", stdin);
	freopen("distante.out", "w", stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);

	int tt;
	cin >> tt;
	while (tt--) {
		solve();
	}

	return 0;
}