Pagini recente » Cod sursa (job #742430) | Cod sursa (job #2424892) | Cod sursa (job #2236101) | Cod sursa (job #527728) | Cod sursa (job #1427688)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
static const int MAXN = 50009;
int dzt[MAXN];
bool u[MAXN];
int dad[MAXN];
int rep(int n) {
if(dad[n] != n) dad[n] = rep(dad[n]);
return dad[n];
}
bool check(int s, int n) {
for(int i = 0; i < n; i++) {
if(rep(i) != s) return false;
}
return true;
}
int main() {
int t;
FILE *f = fopen("distante.in", "rt");
FILE *g = fopen("distante.out", "wt");
fscanf(f, "%d", &t);
for(int i = 0; i < t; i++) {
int n, m, s, a, b, c;
fscanf(f, "%d%d%d", &n, &m, &s);
s--;
for(int j = 0; j < n; j++) {
fscanf(f, "%d", &dzt[j]);
dad[j] = j;
}
bool are_equal = (dzt[s] == 0);
memset(u, 0, sizeof(u));
for(int j = 0; j < m; j++) {
fscanf(f, "%d%d%d", &a, &b, &c);
a--; b--;
if(dzt[a] + c == dzt[b] && (c > 0 || dad[b] == b)) dad[b] = a;
if(dzt[b] + c == dzt[a] && (c > 0 || dad[a] == a)) dad[a] = b;
if(dzt[a] + c < dzt[b] || dzt[b] + c < dzt[a]) are_equal = false;
}
if(are_equal) are_equal = check(s, n);
if(are_equal) {
fprintf(g, "DA\n");
}
else {
fprintf(g, "NU\n");
}
}
fclose(f);
fclose(g);
return 0;
}