Pagini recente » Cod sursa (job #2733861) | Cod sursa (job #513567) | Cod sursa (job #772534) | Cod sursa (job #1571646) | Cod sursa (job #1731907)
#include <fstream>
#define inf 1000000000
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int t;
struct nod
{ int info,cost;
nod *urm;
};
void Addnod(nod *&q, int y , int z)
{ nod *p;
p=new nod;
p->info=y;
p->cost=z;
p->urm=q;
q=p;
}
void Drumuri(int n,int m, int s, int g[50002])
{ int i,j,viz[50002]={0},d[50002]={0},x,y,z,gata=0;
nod *p[50002],*t;
int min,nodd;
for(i=1;i<=m;i++)
{fin>>x>>y>>z;
Addnod(p[x],y,z);
Addnod(p[y],x,z);
}
for(i=1;i<=n;i++)
if(i!=s) d[i]=inf;
for(i=1;i<=n;i++)
{ min=inf;
for(j=1;j<=n;j++)
if(d[j]<min && viz[j]==0)
{min=d[j];
nodd=j;
}
viz[nodd]=1;
t=p[nodd];
while(t)
{ if(d[nodd]+t->cost<d[t->info])
d[t->info]=d[nodd]+t->cost;
t=t->urm;
}
}
for(i=1;i<=n;i++)
if(d[i]!=g[i]) {gata=1;break;}
if(gata==1) fout<<"NU"<<"\n";
else fout<<"DA"<<"\n";
}
void Grafoni()
{ int i,n,m,s,x,y,z;
int g[50002];
fin>>n>>m>>s;
for(i=1;i<=n;i++)
fin>>g[i];
Drumuri(n,m,s,g);
}
int main()
{ int i,j;
fin>>t;
for(i=1;i<=t;i++)
Grafoni();
return 0;
}