Pagini recente » Poze preONI 2007 - pregatiri | Cod sursa (job #3180006) | Cod sursa (job #823056) | Cod sursa (job #1979042) | Cod sursa (job #3203008)
#include <bits/stdc++.h>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
//dijkstra de t ori
const int inf=1e9;
int t,n,m,i,j,h,s,a[50005],x,y,c,dist[50005],fr[50005];
vector< pair<int,int> >G[50005];
priority_queue< pair<int,int> > q;
void dijkstra(int k){
for(int i=1;i<=n;++i) { dist[i]=inf; fr[i]=0; }
q.push( make_pair(0,k) );
dist[k]=0;
while(!q.empty()){
k=q.top().second;
q.pop();
if(fr[k]==0)
for(auto i: G[k])
if(dist[k] + i.second < dist[i.first]){
dist[i.first]=dist[k] + i.second;
q.push( make_pair(-1*dist[i.first] , i.first) );
}
fr[k]=1;
}
}
int main()
{
f>>t;
for(h=1;h<=t;++h){
f>>n>>m>>s;
for(i=1;i<=n;++i) f>>a[i];
for(i=1;i<=m;++i){
f>>x>>y>>c;
G[x].push_back( make_pair(y,c) );
G[y].push_back( make_pair(x,c) );
}
dijkstra(s);
bool ok=true;
for(i=1;i<=n;++i)
if(a[i]!=dist[i]) ok=false;
if(ok) g<<"DA\n";
else g<<"NU\n";
for(i=1;i<=n;++i) G[i].clear();
}
return 0;
}