Pagini recente » Cod sursa (job #640459) | Cod sursa (job #1922559) | Cod sursa (job #327978) | Cod sursa (job #468714) | Cod sursa (job #721125)
Cod sursa(job #721125)
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <set>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
const int T = 11;
const int N = 50005;
int n, m, S;
int dCheck[N];
int curD[N];
vector < pair<int,int> > g[T][N];
set < pair<int,int> > s[T];
void readCase(int test)
{
in >> n >> m >> S;
for (int i = 1; i <= n; ++i)
in >> dCheck[i];
while (m--) {
int a, b, c;
in >> a >> b >> c;
g[test][a].push_back(make_pair(b, c));
g[test][b].push_back(make_pair(a, c));
}
}
void check(int node, int cost, int t)
{
for (int i = 0; i < (int)g[t][node].size(); ++i) {
int next = g[t][node][i].first;
if (curD[next] == 0 || curD[next] > cost + g[t][node][i].second) {
curD[next] = cost + g[t][node][i].second;
s[t].insert(make_pair(curD[next], next));
}
}
}
string solveCase(int t) {
s[t].insert(make_pair(0,S));
memset(curD, 0, sizeof(curD));
while(!s[t].empty()) {
pair<int,int> bighin = *s[t].begin();
int node = bighin.second;
int cost = bighin.first;
if (cost != dCheck[node] && node != S)
return "NU";
s[t].erase(s[t].begin());
check(node, cost, t);
}
return "DA";
}
int main()
{
int t;
in >> t;
while (t--) {
readCase(t);
out << solveCase(t) << "\n";
}
return 0;
}