Pagini recente » Cod sursa (job #761290) | Cod sursa (job #592679) | Cod sursa (job #2855569) | Cod sursa (job #1024928) | Cod sursa (job #2258786)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <limits.h>
#define inf INT_MAX-10
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
vector < pair <int,int> > M[50001];
priority_queue < pair <int,int> > Q;
int n,m,s;
int D[50001],S[50001],P[50001],B[50001];
void Citire()
{ int i,a,b,c;
f>>n>>m>>s;
for(i=1;i<=n;i++)
f>>B[i];
for(i=1;i<=m;i++)
{ f>>a>>b>>c;
M[a].push_back(make_pair(b,c));
M[b].push_back(make_pair(a,c));
}
}
void Dijkstra()
{ int Start=s,poz,i,j,k,c;
for(i=1;i<=n;i++)
{ D[i]=inf;
S[i]=0;
P[i]=0;
}
for(k=0;k<M[Start].size();k++)
{ j=M[Start][k].first;
c=M[Start][k].second;
D[j]=c;
P[j]=Start;
Q.push(make_pair(-c,j));
}
D[Start]=0;
S[Start]=1;
while(!(Q.empty()))
{poz=Q.top().second;
Q.pop();
S[poz]=1;
for(k=0;k<M[poz].size();k++)
{j=M[poz][k].first;
c=M[poz][k].second;
if(S[j]==0&&D[j]>D[poz]+c)
{D[j]=D[poz]+c;
P[j]=poz;
Q.push(make_pair(-D[j],j));
}
}
}
}
int main()
{int t,i,l,ok;
f>>t;
for(l=1;l<=t;l++)
{ Citire();
Dijkstra();
ok=1;
for(i=1;i<=n&&ok==1;i++)
if(D[i]!=B[i])
ok=0;
if(ok==0)
g<<"NU"<<endl;
else g<<"DA"<<endl;
}
f.close();
g.close();
return 0;
}