Cod sursa(job #2819326)

Utilizator alextmAlexandru Toma alextm Data 18 decembrie 2021 11:22:07
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1 kb
#include <bits/stdc++.h>
using namespace std;

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

const int INF = 2e9;
const int MAXN = 50005;
typedef pair<int,int> PII;

int distZ[MAXN];

void Solve() {
	int N, M, src;
	fin >> N >> M >> src;
	
	for(int i = 1; i <= N; i++)
		fin >> distZ[i];
	
	vector<PII> G[N + 1];
	for(int i = 1; i <= M; i++) {
		int a, b, c;
		fin >> a >> b >> c;
		G[a].emplace_back(b, c);
		G[b].emplace_back(a, c);
	}
	
	vector<int> dp(N+1, INF);
	priority_queue<PII> Q;
	
	dp[src] = 0;
	Q.emplace(0, src);
	
	while(!Q.empty()) {
		int dist = -Q.top().first;
		int node = Q.top().second;
		Q.pop();
		
		if(dist != dp[node])
			continue;
			
		for(auto nxt : G[node])
			if(dp[nxt.first] > dp[node] + nxt.second) {
				dp[nxt.first] = dp[node] + nxt.second;
				Q.emplace(-dp[nxt.first], nxt.first);
			}
	}
	
	for(int i = 1; i <= N; i++)
		if(distZ[i] != dp[i]) {
			fout << "NU\n";
			return;
		}
	fout << "DA\n";
}

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