Pagini recente » Cod sursa (job #662951) | Cod sursa (job #1179174) | Cod sursa (job #383672) | Cod sursa (job #2168465) | Cod sursa (job #483319)
Cod sursa(job #483319)
#include<fstream>
#include<vector>
#include<queue>
#define inf 1000000000
#define M 50005
#define mp make_pair
#define pb push_back
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
typedef vector< pair<long, long> > VI;
VI::iterator it;
long t,n,m,s,verif[M],d[M],viz[M];
void cit( VI a[M])
{
long i,x,y,z;
for(i=1;i<=n;++i)
f>>verif[i];
for(i=1;i<=m;++i)
{
f>>x>>y>>z;
a[x].pb(mp(y,z));
a[y].pb(mp(x,z));
}
}
int drum(VI a[M])
{
long i,x,y,z;
queue<long> q;
for(i=1;i<=n;++i)
{
d[i]=inf;
viz[i]=0;
}
d[s]=viz[s]=0;
q.push(s);
while(!q.empty())
{
x=q.front();
q.pop();
viz[x]=0;
for(it=a[x].begin(); it!=a[x].end(); ++it)
{
y=(*it).first;
z=(*it).second;
if(d[y]>d[x]+z) {d[y]=d[x]+z;
if(viz[y]==0) {q.push(y);
viz[i]=1;}
}
}
}
for(i=1;i<=n;++i)
if(verif[i]!=d[i]) return 0;
return 1;
}
int main()
{
int i;
f>>t;
for(i=1;i<=t;++i)
{
VI a[M];
f>>n>>m>>s;
cit(a);
if(drum(a)) g<<"DA\n";
else g<<"NU\n";
}
f.close();
g.close();
return 0;
}