Pagini recente » Cod sursa (job #806295) | Cod sursa (job #3257475) | Cod sursa (job #234523) | Cod sursa (job #2134904) | Cod sursa (job #1367274)
#include <fstream>
# define nmax 50002
# define mmax 200005
# define inf 20000000
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int n,m,t,s;
struct muchie {int x,y,c;};
muchie G[mmax];
int D[nmax],Dr[nmax];
int main()
{f>>t;
int i,ok;
while(t)
{for(i=1;i<=n;++i) D[i]=0;
ok=0;
f>>n>>m>>s;
m=m*2;
for(i=1;i<=n;++i) f>>Dr[i];
for(i=1;i<=m;i=i+2)
{
f>>G[i].x>>G[i].y>>G[i].c;
if(G[i].x==s) D[G[i].y]=G[i].c;
G[i+1].x=G[i].y;
G[i+1].y=G[i].x;
G[i+1].c=G[i].c;
if(G[i+1].x==s) D[G[i+1].y]=G[i+1].c;
}
for(i=1;i<=n;++i)
{
if(D[i]==0 && i!=s) D[i]=inf;
}
while(ok==0)
{
ok=1;
for(i=1;i<=m;++i)
if(D[G[i].y]>D[G[i].x]+G[i].c)
{
D[G[i].y]=D[G[i].x]+G[i].c;
ok=0;
}
}
ok=0;
for(i=1;i<=n;++i)
if(D[i]!=Dr[i]) {ok=1 ; i=n+1;}
if(ok==0) g<<"DA";
else g<<"NU";
if(t>1) g<<"\n";
--t;
}
return 0;
}