Pagini recente » Cod sursa (job #393015) | Cod sursa (job #2250401) | Cod sursa (job #2800638) | Cod sursa (job #2772644) | Cod sursa (job #2174286)
#include <bits/stdc++.h>
#define INF 1000000
#define NMAX 50005
#define cst first
#define nod second
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
vector < pair<int,int> > mv[NMAX];
priority_queue < pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > q;
int viz[NMAX];
int cost[NMAX];
int rezultate[NMAX];
int dijkstra(int x, int nn){
int i;
cost[x]=0;
q.push(make_pair(0,x));
while(!q.empty()){
x=q.top().nod;
q.pop();
if(viz[x])
continue;
viz[x]=1;
for(i=0;i<mv[x].size();i++)
if(cost[mv[x][i].nod]>cost[x]+mv[x][i].cst){
cost[mv[x][i].nod]=cost[x]+mv[x][i].cst;
q.push(make_pair(cost[mv[x][i].nod],mv[x][i].nod));
}
}
for(i=1;i<=nn;i++)
if(cost[i]!=rezultate[i])
return 0;
return 1;
}
int main(){
int t,n,m,s,x,y,c,i;
fin>>t;
for(int j=1;j<=t;j++){
fin>>n>>m>>s;
memset(cost,INF,sizeof(cost));
memset(viz,0,sizeof(viz));
for(i=1;i<=n;i++)
fin>>rezultate[i];
for(i=1;i<=m;i++){
fin>>x>>y>>c;
mv[x].push_back(make_pair(c,y));
mv[y].push_back(make_pair(c,x));
}
if(dijkstra(s,n))
fout<<"DA\n";
else
fout<<"NU\n";
}
return 0;
}