Cod sursa(job #2706244)

Utilizator KlinashkaDiacicov Calin Marian Klinashka Data 14 februarie 2021 13:14:13
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

const long long INF = (int)6e9;
const int NMAX = (int)5e4;
vector<pair<int, int>> adj[NMAX+1];
int N, M, S;
long long dist[NMAX+1];

void dijkstra() {
	bool processed[NMAX+1] = {};
	for(int i=1;i<=N;i++) {
		dist[i] = INF;
	}
	dist[S] = 0;
	priority_queue<pair<long long,int>> q;
	q.push({0, S});
	while(!q.empty()) {
		int v = q.top().second;
		q.pop();
		if(processed[v])
			continue;
		processed[v] = true;
		for(auto i:adj[v]) {
			int len = i.second, e = i.first;
			if(!processed[e] && dist[v]+len < dist[e]) {
				q.push({-dist[v]-len, e});
				dist[e] = dist[v]+len;
			}
		}
	}
}

void solve() {
	scanf("%d %d %d", &N, &M, &S);
	int d[N+1];
	for(int i=1;i<=N;i++) {
		scanf("%d", &d[i]);
		adj[i] = {};
	}
	for(int i=1;i<=M;i++) {
		int a, b, c;
		scanf("%d %d %d", &a, &b, &c);
		adj[a].push_back({b, c});
		adj[b].push_back({a, c});
	}
	dijkstra();
	bool ok = true;
	for(int i=1;i<=N;i++) {
		if(d[i] != dist[i])
			ok = false;
	}
	if(ok)
		printf("DA\n");
	else
		printf("NU\n");
}

int main() {
	freopen("distante.in", "r", stdin);
	freopen("distante.out", "w", stdout);
	int T;
	scanf("%d", &T);
	for(int i=0;i<T;i++) {
		solve();
	}
	return 0;
}