Pagini recente » Cod sursa (job #2802414) | Cod sursa (job #3286972) | Monitorul de evaluare | Istoria paginii stelele-2009/9-10/runda-1 | Cod sursa (job #1461490)
#include<bits/stdc++.h>
#define INF 60000000
using namespace std;
set<pair<int, int> >q;
vector<pair<int, pair<int, int> > >v;
int ans[50005];
bool viz[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;
v.clear();
for(int i = 0; i < n; ++i){
fscanf(fin, "%d", &ans[i]);
viz[i] = 0;
}
for(int i = 0; i < m; ++i) {
fscanf(fin, "%d %d %d", &a, &b, &c);
--a; --b;
v.push_back(make_pair(c, make_pair(a, b)));
v.push_back(make_pair(c, make_pair(b, a)));
}
bool ok = true;
if(ans[s] != 0)
ok = false;
viz[s] = 1;
for(int i = 0; i < v.size(); ++i) {
c = v[i].first;
a = v[i].second.first;
b = v[i].second.second;
if(ans[a] + c < ans[b])
ok = false;
if(ans[a] + c == ans[b])
viz[b] = 1;
}
for(int i = 0; i < n; ++i)
if(viz[i] == 0)
ok = false;
if(ok == true)
fprintf(fout, "DA\n");
else
fprintf(fout, "NU\n");
}
}