Pagini recente » Cod sursa (job #1332295) | Cod sursa (job #2567495) | Cod sursa (job #1062786) | Cod sursa (job #2352784) | Cod sursa (job #2527367)
#include <bits/stdc++.h>
using namespace std;
ifstream f("distante.in"); ofstream g("distante.out");
const int INF=1e9+1;
int t,viz[50001],n,m,x,y,dist[50001],z,start,d[50001];
vector < pair<int,int> > edge[50001];
priority_queue<int, vector<int>, greater<int> > q;
void dijkstra(int start)
{ q.push(start);
dist[start]=0;
viz[start]=1;
while (!q.empty())
{ int vert=q.top();
q.pop();
viz[vert]=0;
for(int i=0;i<edge[vert].size();i++)
{ int near=edge[vert][i].first;
int cost=edge[vert][i].second;
if(dist[near]>dist[vert]+cost)
{ dist[near]=dist[vert]+cost;
if(!viz[near])
{ viz[near]=1;
q.push(near);
}
}
}
}
}
int main()
{ f>>t;
for(int xd=1;xd<=t;xd++)
{ f>>n>>m>>start;
for(int i=1;i<=n;i++)
{ dist[i]=INF;
viz[i]=0;
edge[i].clear();
}
for(int i=1;i<=n;i++) f>>d[i];
for(int i=1;i<=m;i++)
{ f>>x>>y>>z;
edge[x].push_back(make_pair(y,z));
edge[y].push_back(make_pair(x,z));
}
dijkstra(start);
d[start]=0;
bool ok=true;
for(int i=1;i<=n && ok;i++)
if(d[i]!=dist[i]) ok=0;
if(ok==true) g<<"DA"<<'\n';
else g<<"NU"<<'\n';
}
g.close(); return 0;
}