Pagini recente » Cod sursa (job #196852) | Cod sursa (job #547645) | Cod sursa (job #2109239) | Cod sursa (job #430344) | Cod sursa (job #961737)
Cod sursa(job #961737)
#include <fstream>
#include <vector>
#define mp make_pair
#define x first
#define y second
using namespace std;
const char iname[] = "distante.in";
const char oname[] = "distante.out";
ifstream fin(iname);
ofstream fout(oname);
int T, N, M, S, i, j, a, b, c, ok;
bool OK[50001];
int d[50001];
vector < pair <int, int> > v[50001];
vector < pair <int, int> > :: iterator it;
int check(int x){
for (int k = 1; k <= x; ++k)
if (!OK[k] && k != S) return 0;
return 1;
}
int main(){
fin >> T;
while (T--){
fin >> N >> M >> S;
for (i = 1; i <= N; ++i) fin >> d[i];
for (i = 1; i <= M; ++i){
fin >> a >> b >> c;
v[a].push_back(mp(b, c));
v[b].push_back(mp(a, c));
}
ok = 1;
for (i = 1; i <= N; ++i) OK[i] = 0;
if (d[S] != 0) continue;
for (i = 1; i <= N && ok; ++i){
it = v[i].begin();
for (; it != v[i].end() && ok; ++it){
if (d[i] + it -> second < d[it -> first]){
ok = 0;
}
else
if (it -> first != S && d[i] + it -> second == d[it -> first]) OK[it -> first] = 1;
}
}
if (ok && check(N)) fout << "DA\n";
else
fout << "NU\n";
}
return 0;
}