Pagini recente » Istoria paginii runda/oni_11_12_5/clasament | Cod sursa (job #2354220) | Cod sursa (job #1110720) | Istoria paginii runda/drumarb/clasament | Cod sursa (job #1426915)
#include <stdio.h>
#include <vector>
#define NMAX 50001
using namespace std;
int n, m, t, start, allGood, currNode, currDist;
int intrare[NMAX], iesire[NMAX], viz[NMAX];
vector< pair<int, int> > graf[NMAX];
void dfs(int node, int dist) {
if(dist == intrare[node]) iesire[node] = 1;
viz[node] = 1;
for(int i = 0; i < graf[node].size(); ++i) {
if(!viz[graf[node][i].first])
dfs(graf[node][i].first, dist + graf[node][i].second);
}
viz[node] = 0;
}
int main() {
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
int x, y, c;
scanf("%d", &t);
while(t--) {
for(int i = 1; i <= n; ++i) {
graf[i].clear();
iesire[i] = 0;
}
scanf("%d%d%d", &n, &m, &start);
for(int i = 1; i <= n; ++i) {
scanf("%d", &intrare[i]);
}
for(int i = 0; i < m; ++i) {
scanf("%d%d%d", &x, &y, &c);
graf[x].push_back(make_pair(y, c));
graf[y].push_back(make_pair(x, c));
}
dfs(start, 0);
allGood = 1;
for(int i = 1; i <= n; ++i) {
if(!iesire[i]) {
allGood = 0;
break;
}
}
printf("%s\n", allGood ? "DA" : "NU");
}
return 0;
}