Pagini recente » Borderou de evaluare (job #2154500) | Borderou de evaluare (job #734822) | Borderou de evaluare (job #30262) | Borderou de evaluare (job #202114) | Cod sursa (job #365194)
Cod sursa(job #365194)
#include <stdio.h>
#include <vector>
using namespace std;
#define Mmax 100001
#define inf 1<<30
int n,m,s,t,x[Mmax],y[Mmax];
long c[Mmax],dx[Mmax/2+1],d[Mmax/2];
FILE *f=fopen("distante.in","r");
FILE *g=fopen("distante.out","w");
void read()
{
int i;
fscanf(f,"%d %d %d",&n,&m,&s);
m*=2;
for(i=1;i<=n;++i) { fscanf(f,"%ld",&dx[i]); d[i]=inf; }
for(i=1;i<=m;i+=2)
{
fscanf(f,"%d %d %ld",&x[i],&y[i],&c[i]);
y[i+1]=x[i];
x[i+1]=y[i];
c[i+1]=c[i];
if(x[i]==s)
d[y[i]]=c[i];
if(x[i+1]==s)
d[y[i+1]]=c[i+1];
}
d[s]=0;
}
void solve()
{
bool ok=true;
int i;
while(ok)
{
ok=false;
for(i=1;i<=m;++i)
{
if(d[y[i]]>d[x[i]]+c[i])
{
d[y[i]]=d[x[i]]+c[i];
ok=true;
}
}
}
}
void show()
{
int i;
for(i=1;i<=n;++i)
if(!(d[i]==dx[i]||(dx[i]==0&&d[i]==inf)))
{
fprintf(g,"NU\n");
return;
}
fprintf(g,"DA\n");
}
int main()
{
fscanf(f,"%d",&t);
while(t)
{
read();
solve();
show();
--t;
}
return 0;
}