Pagini recente » Cod sursa (job #1378239) | Cod sursa (job #2097369) | Cod sursa (job #2239419) | Cod sursa (job #1899667) | Cod sursa (job #721154)
Cod sursa(job #721154)
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <string>
#include <set>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
const int INF = 0x3f3f3f3f;
const int N = 50005;
int n, source;
int dRead[N];
int dCur[N];
vector < pair<int,int> > g[N];
set < pair<int,int> > s;
void readCase() {
int m;
in >> n >> m >> source;
for (int i = 1; i <= n; ++i) {
in >> dRead[i];
g[i].clear();
}
while (m--) {
int a, b, c;
in >> a >> b >> c;
g[a].push_back(make_pair(b, c));
g[b].push_back(make_pair(a, c));
}
}
void check(int node, int cost) {
for (int i = 0; i < (int)g[node].size(); ++i) {
int next = g[node][i].first;
if (cost + g[node][i].second < dCur[next]) {
dCur[next] = cost + g[node][i].second;
s.insert(make_pair(dCur[next], next));
}
}
}
string solveCase() {
memset(dCur, INF, sizeof(dCur));
dCur[source] = 0;
s.insert(make_pair(0, source));
while (!s.empty()) {
pair <int,int> bighin = *s.begin();
int node = bighin.second;
int cost = bighin.first;
s.erase(s.begin());
if (cost != dRead[node])
return "NU";
check(node, cost);
}
return "DA";
}
int main() {
int t;
in >> t;
while (t--) {
readCase();
out << solveCase() << "\n";
}
return 0;
}