Pagini recente » Cod sursa (job #2253594) | Cod sursa (job #352339) | Cod sursa (job #198874) | Cod sursa (job #3245567) | Cod sursa (job #1461482)
#include<bits/stdc++.h>
#define INF 60000000
using namespace std;
set<pair<int, int> >q;
vector<pair<int, int> >v[50005];
int d[50005], ans[50005];
int main()
{
int t;
FILE *fin = fopen("distante.in", "r");
FILE *fout = fopen("distante.out", "w");
fscanf(fin, "%d", &t);
while(t--) {
int n, m, s, a, b, c;
q.clear();
fscanf(fin, "%d %d %d", &n, &m, &s);
--s;
for(int i = 0; i < n; ++i)
v[i].clear();
for(int i = 0; i < n; ++i)
fscanf(fin, "%d", &ans[i]);
for(int i = 0; i < m; ++i) {
fscanf(fin, "%d %d %d", &a, &b, &c);
--a; --b;
v[a].push_back(make_pair(b, c));
v[b].push_back(make_pair(a, c));
}
q.insert(make_pair(0, s));
for(int i = 0; i < n; ++i)
d[i] = INF;
d[s] = 0;
while(!q.empty()) {
int x = (*q.begin()).first;
int j = (*q.begin()).second;
q.erase(*q.begin());
// cout<<j<<": ";
for(int i = 0; i < v[j].size(); ++i) {
//cout << v[j][i].first << " ";
if(x + v[j][i].second < d[v[j][i].first]) {
d[v[j][i].first] = x + v[j][i].second ;
q.insert(make_pair(d[v[j][i].first], v[j][i].first));
}
}
}
bool ok = true;
for(int i = 0; i < n; ++i) {
// cout << ans[i] << " "<<d[i] << "\n";
if(ans[i] != d[i])
ok = false;
}
if(ok == true) {
fprintf(fout, "DA\n");
} else
fprintf(fout, "NU\n");
}
}