Pagini recente » Cod sursa (job #1293409) | Cod sursa (job #589942) | Cod sursa (job #1869839) | Cod sursa (job #1722580) | Cod sursa (job #1266635)
/// Craciun Catalin
/// Distante
#include <iostream>
#include <fstream>
#include <set>
#include <vector>
#define mp make_pair
#define ins insert
#define inf 1<<30
#define NMax 50005
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int t;
int n, m, s;
set< pair<int, int> > heap;
int distEs[NMax];
int dist[NMax];
vector<int> Vec[NMax];
vector<int> C[NMax];
void compare() {
bool ok = true;
for (int i=1;i<=n;i++)
if (dist[i] != distEs[i]) {
ok = false;
break;
}
if (ok)
g<<"DA\n";
else
g<<"NU\n";
}
void dijkstra() {
heap.clear();
for (int i=1;i<=n;i++)
dist[i] = inf;
dist[s] = 0;
heap.ins(mp(0,s));
while (!heap.empty()) {
int val = (*heap.begin()).first, nod = (*heap.begin()).second;
heap.erase(heap.begin());
for (unsigned i=0;i<Vec[nod].size();i++) {
int vecin = Vec[nod][i];
if (dist[vecin] > dist[nod] + C[nod][i]) {
heap.erase(mp(dist[vecin], vecin));
dist[vecin] = dist[nod] + C[nod][i];
heap.insert(mp(dist[vecin], vecin));
}
}
}
compare();
}
void read() {
f>>t;
for (int q=1;q<=t;q++) {
f>>n>>m>>s;
for (int i=1;i<=n;i++)
f>>distEs[i];
for (int i=1;i<=n;i++) {
Vec[i].resize(0);
C[i].resize(0);
}
for (int i=1;i<=m;i++) {
int x, y, c; f>>x>>y>>c;
Vec[x].push_back(y); C[x].push_back(c);
Vec[y].push_back(x); C[y].push_back(c);
}
dijkstra();
}
}
int main() {
read();
f.close(); g.close();
return 0;
}