Pagini recente » Autentificare | Cod sursa (job #1265944) | Istoria paginii runda/summer_camp_4/clasament | Cod sursa (job #72591) | Cod sursa (job #1648680)
#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();
}
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);
}
cautaDrumuri();
for (int i=1; i<=n; ++i) {
if (distante[i] == inf) distante[i] = 0;
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();
}
}