Cod sursa(job #1762595)

Utilizator delia_ioanaCeapa Delia Ioana delia_ioana Data 23 septembrie 2016 20:48:34
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<stdio.h>
#include<vector>
#include<queue>
#include<string.h>
#include<climits>
#include<iostream>

using namespace std;

int t, s, n, m, x, y, c, D[50001];
vector<int> dij(50001);
vector< vector <pair<int,int> > > adiacente(50001);

struct cmp {
	bool operator() (const int &x, const int &y) {
		return dij[x] > dij[y];
	}
};

priority_queue<int,vector<int>,cmp> Q;

int main() {
	freopen("distante.in", "r", stdin);
	freopen("distante.out", "w", stdout);

	scanf("%d", &t);
	for (int j = 0; j < t; j ++) {
		
		dij.clear();
		for (int i = 0; i < 50001; i ++) dij.push_back(INT_MAX);

		scanf("%d %d %d", &n, &m, &s);

		for (int i = 1; i <= n; i ++) {
			adiacente[i].clear();
			scanf("%d", &D[i]);
		}

		for (int i = 0; i < m; i ++) {
			scanf("%d %d %d", &x, &y, &c);
			adiacente[x].push_back(make_pair(y, c));
			adiacente[y].push_back(make_pair(x, c));
		}

		dij[s] = 0;
		Q.push(s);

		while (!Q.empty()) {
			x = Q.top();
			for (int i = 0; i < adiacente[x].size(); i ++)
				if (dij[x] + adiacente[x][i].second < dij[adiacente[x][i].first]) {
						dij[adiacente[x][i].first] = dij[x] + adiacente[x][i].second;
						Q.push(adiacente[x][i].first);
					}
			Q.pop();
		}

		bool flag = true;
		for (int i = 1; i <= n; i ++) {
			//cout << dij[i] << " " << D[i] << endl;
			if (dij[i] != D[i])
				flag = false;
		}
			//if (dij[i] == INT_MAX)
			//	dij[i] = 0;
		if (flag)
			printf("DA\n");
			else printf("NU\n");
	}

	return 0;
}