Pagini recente » Cod sursa (job #1262617) | Cod sursa (job #2884345) | Cod sursa (job #167832) | Cod sursa (job #1597419) | Cod sursa (job #1762573)
#include<stdio.h>
#include<vector>
#include<queue>
#include<climits>
using namespace std;
int t, s, n, m, x, y, c;
vector< vector <pair<int,int> > > adiacente(50001);
vector<bool> vizitat(50001);
vector<int> dij(50001, INT_MAX), D;
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 ++) {
scanf("%d %d %d", &n, &m, &s);
for (int i = 0; i < n; i ++) {
scanf("%d", &x);
D.push_back(x);
}
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 ++)
if (dij[i] != D[i - 1])
flag = false;
//if (dij[i] == INT_MAX)
// dij[i] = 0;
if (flag)
printf("DA\n");
else printf("NU\n");
}
return 0;
}