Pagini recente » Cod sursa (job #2138437) | Cod sursa (job #1742635) | Cod sursa (job #1481995) | Cod sursa (job #3289315) | Cod sursa (job #2562534)
#include <bits/stdc++.h>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
using pii = pair<int,int>;
const int INF = 1e9 + 5, Nmax = 50005;
vector<int> maybe_sp, dp;
vector<pii> G[Nmax];
vector<bool> seen;
priority_queue <pii> Q;
int main()
{
ios_base::sync_with_stdio(0);
in.tie(0);
int T,N,M,start;
in >> T;
while(T--)
{
in >> N >> M >> start;
maybe_sp.assign(N + 1,0);
for(int i = 1; i <= N; ++i)
{in >> maybe_sp[i];
G[i].clear();}
int x, y, c;
while(M--)
{
in >> x >> y >> c;
G[x].push_back({y,c});
G[y].push_back({x,c});
}
dp.assign(N + 1,INF);
for(auto i : G[start])
{
dp[i.first] = i.second;
Q.push({dp[i.first],i.first});
}
seen.assign(N + 1,0);
while(!Q.empty())
{
while(!Q.empty() && seen[Q.top().second])
Q.pop();
if(!Q.empty())
{
int node = Q.top().second;
seen[node];
Q.pop();
for(auto i : G[node])
if(dp[node] + i.second < dp[i.first])
{
dp[i.first] = dp[node] + i.second;
Q.push({dp[i.first],i.first});
}
}
}
bool OK = true;
dp[start] = 0;
for(int i = 1; i <= N && OK; ++i)
if(dp[i] != maybe_sp[i])
OK = false;
out << (OK ? "DA" : "NU") << '\n';
}
return 0;
}