Cod sursa(job #2819287)

Utilizator alextmAlexandru Toma alextm Data 18 decembrie 2021 10:56:36
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <bits/stdc++.h>
using namespace std;

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

const int MAXN = 50001;
const int INF = 1e9;
typedef pair<int,int> PII;

int n, m, start, distZ[MAXN], d[MAXN];
vector<PII> G[MAXN];
priority_queue<PII, vector<PII>, greater<PII>> PQ;

void Dijkstra(int src) {
	for(int i = 1; i <= n; i++)
		d[i] = INF;
	
	d[src] = 0;
	PQ.push({0, src});
	
	while(!PQ.empty()) {
		int dist = PQ.top().first;
		int node = PQ.top().second;
		PQ.pop();
		
		if(dist > d[node])
			continue;
			
		for(auto nxt : G[node])
			if(d[node] + nxt.second < d[nxt.first]) {
				d[nxt.first] = d[node] + nxt.second;
				PQ.push({d[nxt.first], nxt.first});
			}
	}
}

void Solve() {
	fin >> n >> m >> start;
	for(int i = 1; i <= n; i++)
		fin >> distZ[i];
		
	int x, y, z;
	while(m--) {
		fin >> x >> y >> z;
		G[x].emplace_back(y, z);
		G[y].emplace_back(x, z);
	}
	
	Dijkstra(start);
	
	int check = 1;
	for(int i = 1; i <= n && check; i++)
		if(distZ[i] != d[i])
			check = 0;
			
	fout << (check == 1 ? "DA\n" : "NU\n");
}

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