Pagini recente » Cod sursa (job #849170) | Cod sursa (job #1858281) | Cod sursa (job #2624719) | Cod sursa (job #2445692) | Cod sursa (job #1427645)
#include <fstream>
#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<pii> G[MAXN];
int dz[MAXN];
int u[MAXN];
int n;
bool check(int src) {
if(dz[src] != 0) return false;
int nodesLeft = n;
queue<int> q;
memset(u, 0, sizeof(u));
q.push(src);
u[src] = true;
n--;
while(!q.empty()) {
src = q.front();
q.pop();
for(int i = 0, l = G[src].size(); i < l; i++) {
int dif = dz[src] + G[src][i].second - dz[G[src][i].first];
if(dif == 0 && !u[G[src][i].first]) {
u[G[src][i].first] = true;
q.push(G[src][i].first);
n--;
}
else if(dif < 0) return false;
}
}
return (n == 0);
}
int main() {
int t;
ifstream f("distante.in");
ofstream g("distante.out");
f >> t;
for(int i = 0; i < t; i++) {
int m, s, a, b, c;
f >> n >> m >> s;
s--;
for(int j = 0; j < n; j++) {
f >> dz[j];
G[j].clear();
}
for(int j = 0; j < m; j++) {
f >> a >> b >> c;
a--; b--;
G[a].push_back(pii(b, c));
G[b].push_back(pii(a, c));
}
bool areEqual = check(s);
if(areEqual) {
g << "DA\n";
}
else {
g << "NU\n";
}
}
f.close();
g.close();
return 0;
}