Cod sursa(job #3296562)

Utilizator rusepetruRuse Petru rusepetru Data 13 mai 2025 19:22:50
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <climits>
#include <fstream>
#include <iostream>
#include <list>
#include <queue>
#include <vector>
using namespace std;

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

int arr[50001];
int dist[50001];
char visited[50001];
list<pair<int, int>> adj[50001];

typedef pair<int, int> pii;

#define INF (INT_MAX)

void distante() {
	int n, m, s;
	fin >> n >> m >> s;
	for (int i = 1; i <= n; ++i) {
		fin >> arr[i];
	}
	for (int i = 1; i <= n; ++i) {
		adj[i] = list<pair<int, int>>();
		dist[i] = INF;
		visited[i] = 0;
	}
	for (int i = 0; i < m; ++i) {
		int x, y, c;
		fin >> x >> y >> c;
		adj[x].push_back({y, c});
		adj[y].push_back({x, c});
	}
	dist[s] = 0;
	priority_queue<pii, vector<pii>, greater<pii>> q;
	q.push({0, s});
	while (!q.empty()) {
		auto [d, u] = q.top();
		q.pop();
		if (visited[u]) {
			continue;
		}
		visited[u] = true;
		for (auto &[v, c] : adj[u]) {
			if (dist[u] + c < dist[v]) {
				dist[v] = dist[u] + c;
				q.push({dist[v], v});
			}
		}
	}
	for (int i = 1; i <= n; ++i) {
		if (dist[i] != arr[i]) {
			fout << "NU\n";
			return;
		}
	}
	fout << "DA\n";
}

int main() {
	int k;
	fin >> k;
	for(int i = 0; i < k; i++)
		distante();
	return 0;
}