Pagini recente » Cod sursa (job #3234771) | Cod sursa (job #1403103) | Cod sursa (job #2359713) | Cod sursa (job #1600993) | Cod sursa (job #1427655)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
static const int INF = 1000000000;
static const int MAXN = 50001;
typedef pair<int, int> pii;
vector<int> vecin[MAXN];
vector<int> cost_vecin[MAXN];
int dz[MAXN];
int u[MAXN];
int n;
int q[MAXN], qfront, qback;
bool check(int src) {
if(dz[src] != 0) return false;
int vec, cost_vec, dif;
memset(u, 0, sizeof(u));
qfront = 0; qback = 0;
q[qback++] = src;
u[src] = true;
n--;
while(qfront < qback) {
src = q[qfront++];
for(int i = 0, l = vecin[src].size(); i < l; i++) {
vec = vecin[src][i];
cost_vec = cost_vecin[src][i];
dif = dz[src] + cost_vec - dz[vec];
if(dif == 0 && !u[vec]) {
u[vec] = true;
q[qback++] = vec;
n--;
}
else if(dif < 0) return false;
}
}
return (n == 0);
}
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 m, s, a, b, c;
fscanf(f, "%d%d%d", &n, &m, &s);
s--;
for(int j = 0; j < n; j++) {
fscanf(f, "%d", &dz[j]);
vecin[j].clear();
cost_vecin[j].clear();
}
for(int j = 0; j < m; j++) {
fscanf(f, "%d%d%d", &a, &b, &c);
a--; b--;
vecin[a].push_back(b);
cost_vecin[a].push_back(c);
vecin[b].push_back(a);
cost_vecin[b].push_back(c);
}
bool areEqual = check(s);
if(areEqual) {
fprintf(g, "DA\n");
}
else {
fprintf(g, "NU\n");
}
}
fclose(f);
fclose(g);
return 0;
}