Pagini recente » Statistici Daria Mihaescu (Daria_0827) | Cod sursa (job #962379) | Cod sursa (job #1363679) | Cod sursa (job #2068656) | Cod sursa (job #3128314)
#include <bits/stdc++.h>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
const int nlim = 50005;
const int oo = 1 << 30;
int n, m, nodstart, D[nlim], InCoada[nlim], expected[nlim];
vector<pair<int, int>> muchii[nlim];
struct comp {
bool operator()(int x, int y) { return D[x] > D[y]; }
};
void Dijkstra(int nodstart) {
priority_queue<int, vector<int>, comp> coada;
for (int i = 1; i <= n; i++)
InCoada[nlim] = 0;
coada.push(nodstart);
InCoada[nodstart] = 1;
D[nodstart] = 0;
while (!coada.empty()) {
int nod = coada.top();
coada.pop();
InCoada[nod] = 0;
for (int i = 0; i < muchii[nod].size(); i++) {
int vecin = muchii[nod][i].first;
int cost = muchii[nod][i].second;
if (D[nod] + cost < D[vecin]) {
D[vecin] = D[nod] + cost;
if (InCoada[vecin] == 0) {
coada.push(vecin);
InCoada[vecin] = 1;
}
}
}
}
bool ok = true;
for (int i = 1; i <= n; i++) {
if (D[i] != oo && D[i] != expected[i]) {
ok = false;
break;
}
if (D[i] == oo && expected[i] != -1) {
ok = false;
break;
}
}
if (ok == true)
g << "DA\n";
else
g << "NU\n";
}
void citire() {
f >> n >> m >> nodstart;
for (int i = 1; i <= n; i++)
f >> expected[i];
for (int i = 1; i <= n; i++)
muchii[i].clear();
int x, y, c;
for (int i = 1; i <= m; i++) {
f >> x >> y >> c;
muchii[x].push_back(make_pair(y, c));
}
for (int i = 1; i <= n; i++)
D[i] = oo;
}
int main() {
int T;
f >> T;
for (int i = 1; i <= T; i++) {
citire();
Dijkstra(nodstart);
}
return 0;
}