Pagini recente » Cod sursa (job #2886542) | Cod sursa (job #2876282) | Cod sursa (job #121675) | Cod sursa (job #3127865) | Cod sursa (job #1648823)
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
std::ifstream f("distante.in");
std::ofstream g("distante.out");
const int inf = 1 << 30;
struct muchie {
int des;
int cost;
};
std::vector<muchie> noduri[50001];
int distante[50001];
int distanteO[50001];
bool locked[50001];
std::queue<int> lista;
int n, m, s;
void cautaDrumuri() {
lista.push(s);
distante[s] = 0;
while (!lista.empty()) {
int x = lista.front();
lista.pop();
locked[x] = 0;
for (int i=0; i<noduri[x].size(); ++i) {
int drum = distante[x] + noduri[x][i].cost;
if (drum < distante[noduri[x][i].des]) {
distante[noduri[x][i].des] = drum;
if (!locked[noduri[x][i].des]) {
locked[noduri[x][i].des] = 1;
lista.push(noduri[x][i].des);
}
}
}
}
}
void citesteGraf() {
f >> n >> m >> s;
for (int i=1; i<=n; ++i) {
f >> distanteO[i];
distante[i] = inf;
locked[i] = 0;
noduri[i].clear();
//std::cout << i << " " << distanteO[i] << " " << distante[i] << " " << locked[i] << " " << noduri[i].size() << "\n";
} //std::cout << "\n";
if (distanteO[s] != 0) {
g << "NU\n";
return;
}
int x, y, c;
for (int i=0; i<m; ++i) {
f >> x >> y >> c;
muchie a; a.des = y; a.cost = c;
noduri[x].push_back(a);
//std::cout << i << " " << x << " " << y << " " << c << "\n";
} //std::cout << "\n";
cautaDrumuri();
for (int i=1; i<=n; ++i) {
if (distante[i] == inf) distante[i] = -1;
//std::cout << i << " " << distanteO[i] << " " << distante[i] << "\n";
if (distante[i] != distanteO[i]) {
g << "NU\n";
return;
}
}
g << "DA\n";
}
int main() {
int grafuri;
f >> grafuri;
for (int i=0; i<grafuri; ++i) {
citesteGraf();
}
}