Pagini recente » Cod sursa (job #675438) | Cod sursa (job #107025) | Cod sursa (job #2451737) | Cod sursa (job #187847) | Cod sursa (job #1762595)
#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;
}