Pagini recente » Cod sursa (job #1452954) | Cod sursa (job #329320) | Cod sursa (job #2173612) | Cod sursa (job #3234079) | Cod sursa (job #2110912)
#include <iostream>
#include <fstream>
#include <vector>
#define MAX 50002
using namespace std;
ifstream in ("distante.in");
ofstream out("distante.out");
int Teste, n, m, s, Dist[MAX];
bool verif[MAX];
struct edge {
int x, y, cost;
} graf[2 * MAX];
void citire() {
in >> n >> m >> s;
for (int i = 1; i <= n; i++) {
in >> Dist[i];
verif[i] = false;
}
for (int i = 1; i <= m; i++)
in >> graf[i].x >> graf[i].y >> graf[i].cost;
}
bool verificare() {
if (Dist[s])
return false;
verif[s] = true;
for (int i = 1; i <= m; i++) {
int X = graf[i].x, Y = graf[i].y, C = graf[i].cost;
int SumX = Dist[X] + C, SumY = Dist[Y] + C;
if (SumX < Dist[Y])
return false;
if (SumY < Dist[X])
return false;
if (SumX == Dist[Y])
verif[Y] = true;
if (SumY == Dist[X])
verif[X] = true;
}
for (int i = 1; i <= n; i++)
if (!verif[i])
return false;
return true;
}
int main() {
in >> Teste;
while (Teste--) {
citire();
if (verificare())
out << "DA\n";
else
out << "NU\n";
}
return 0;
}