Pagini recente » Cod sursa (job #184374) | Cod sursa (job #2782434) | Cod sursa (job #1812670) | Cod sursa (job #939156) | Cod sursa (job #2833622)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int NMAX=50005;
const int inf=2e9;
int T, N, M, sol[NMAX], dp[NMAX];
struct element{
int nod, cost;
};
struct compare{
bool operator()(element &A, element &B){
return A.cost>B.cost;
}
};
bool Dijkstra(int sursa, vector<element> g[NMAX])
{
priority_queue<element,vector<element>,compare> q;
for(int i=1;i<=N;i++)
dp[i]=inf;
dp[sursa]=0;
q.push({sursa,0});
element x;
while(!q.empty()){
x=q.top();
q.pop();
if(x.cost!=dp[x.nod]) continue;
for(auto nxt: g[x.nod]){
if(dp[nxt.nod]>dp[x.nod]+nxt.cost){
dp[nxt.nod]=dp[x.nod]+nxt.cost;
q.push({nxt.nod,dp[nxt.nod]});
}
}
}
for(int i=1;i<=N;i++)
if(sol[i]!=dp[i])
return false;
return true;
}
int main()
{
fin>>T;
int sursa, x, y, cost;
while(T--){
vector<element> g[NMAX];
fin>>N>>M>>sursa;
for(int i=1;i<=N;i++)
fin>>sol[i];
for(int i=1;i<=M;i++){
fin>>x>>y>>cost;
g[x].push_back({y,cost});
g[y].push_back({x,cost});
}
if(Dijkstra(sursa,g))
fout<<"DA"<<'\n';
else
fout<<"NU"<<'\n';
}
fin.close();
fout.close();
return 0;
}