Mai intai trebuie sa te autentifici.
Cod sursa(job #2021214)
Utilizator | Data | 12 septembrie 2017 21:28:09 | |
---|---|---|---|
Problema | Distante | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.65 kb |
# include <bits/stdc++.h>
# define per pair <int, int>
using namespace std;
const int inf = INT_MAX, Nmax = 5 * 1e5 + 5;
int T, i, n, m, father, x, y, z, Distance[Nmax], query[Nmax];
vector < pair <int, int> > G[Nmax];
void dijkstra (int father)
{
priority_queue < per, vector < per >, greater < per > > pq;
int cost, node;
for (i = 1; i <= n; Distance[i] = inf, ++i);
Distance[father] = 0, pq.push({0, father});
while (pq.size())
{
per current = pq.top();
cost = current.first, node = current.second, pq.pop();
if (cost != Distance[node]) continue;
for (auto &it: G[node])
{
if (it.second + cost >= Distance[it.first]) continue;
Distance[it.first] = it.second + cost;
pq.push({Distance[it.first], it.first});
}
}
}
int main ()
{
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
scanf("%d\n", &T);
for (; T; --T)
{
scanf("%d %d %d\n", &n, &m, &father);
for (i = 1; i <= n; ++i)
scanf("%d ", &query[i]);
for (i = 1; i <= m; ++i)
{
scanf("%d %d %d\n", &x, &y, &z);
G[x].push_back({y, z});
}
dijkstra(father);
bool ans = true;
for (i = 1; i <= n; ++i)
if (Distance[i] != query[i])
{
ans = false;
break;
}
if (ans) printf("DA\n");
else printf("NU\n");
for (i = 1; i <= n; ++i)
while (G[i].size()) G[i].pop_back();
}
return 0;
}