Pagini recente » Cod sursa (job #2888460) | Cod sursa (job #35305) | Cod sursa (job #1164685) | Cod sursa (job #212246) | Cod sursa (job #2038027)
#include <fstream>
#include <vector>
#include <set>
#define DEF 50001
#define INF 200001
using namespace std;
ifstream fin ("distante.in");
ofstream fout ("distante.out");
int t, n, m, s, d[DEF], sol[DEF], viz[DEF];
set < pair < int, int > > S;
vector < pair < int, int > > L[DEF];
void afis () {
for (int i = 1; i <= n; i++) {
if (d[i] != sol[i]) {
fout << "NU\n";
return;
}
}
fout << "DA\n";
}
int main () {
fin >> t;
for (;t > 0; t--) {
fin >> n >> m >> s;
for (int i = 1; i <= n; i++) {
fin >> sol[i];
viz[i] = 0;
d[i] = INF;
L[i].clear ();
}
for (int i = 1; i <= m; i++) {
int x, y, c;
fin >> x >> y >> c;
L[x].push_back (make_pair (y, c));
L[y].push_back (make_pair (x, c));
}
d[s] = 0;
S.insert (make_pair (0, s));
while (!S.empty ()) {
int nod = S.begin () -> second;
S.erase (S.begin ());
viz[nod] = 1;
for (vector < pair < int, int > >::iterator it = L[nod].begin (); it != L[nod].end(); it++) {
int vecin = it -> first;
int cost = it -> second;
if (d[vecin] > d[nod] + cost && viz[vecin] == 0) {
if (d[vecin] != INF)
S.erase (S.find (make_pair (d[vecin], vecin)));
d[vecin] = d[nod] + cost;
S.insert (make_pair (d[vecin], vecin));
}
}
}
afis ();
S.clear ();
}
return 0;
}