Pagini recente » Cod sursa (job #1532947) | Cod sursa (job #2322491) | Cod sursa (job #179145) | Cod sursa (job #1725898) | Cod sursa (job #1731917)
#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],*ta,*q;
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;
ta=p[nodd];
while(ta)
{ if(d[nodd]+ta->cost<d[ta->info])
d[ta->info]=d[nodd]+ta->cost;
ta=ta->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";
/*for(i=1;i<=n;i++)
{q=p[i];
while(q)
{ ta->urm=q->urm;
delete q;
q=ta->urm;
}
}*/
}
void Grafoni()
{ int i,n,m,s;
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;
fin>>t;
for(i=1;i<=t;i++)
Grafoni();
return 0;
}