Pagini recente » Cod sursa (job #1079771) | Cod sursa (job #2744304) | Cod sursa (job #236332) | Cod sursa (job #389895)
Cod sursa(job #389895)
# include <fstream.h>
ifstream f ("distante.in");
ofstream g ("distante.out");
int d[50005],h[50005],poz[50005],min,aux,i,n,m,s,x,z,y,ok,k,df[50005],inf=1000000,t,l,min2;
struct nod
{
int info,cost;
nod *urm;
}*a[50005],*p;
void sss (int i)
{
if (i/2)
{
if (d[h[i/2]]>d[h[i]])
{
aux=h[i];
h[i]=h[i/2];
h[i/2]=aux;
poz[h[i]]=i;
poz[h[i/2]]=i/2;
sss (i/2);
}
}
}
void jjj (int i)
{
if (2*i+1<=m)
{
if (d[h[2*i]]<d[h[2*i+1]])
min2=2*i;
else
min2=2*i+1;
}
else
if (2*i==m)
min2=2*i;
if (d[h[i]]>d[h[min]])
{
aux=h[i];
h[i]=h[min2];
h[min2]=aux;
poz[i]=i;
poz[min2]=min2;
}
}
void adauga (int x)
{
m++;
h[m]=x;
poz[x]=m;
sss (m);
}
void sterg ()
{
h[1]=h[m];
m--;
poz[h[1]]=1;
jjj (1);
}
int main ()
{
f>>t;
for (l=1;l<=t;l++)
{
f>>n>>m>>s;
for (i=1;i<=n;i++)
f>>df[i];
for (i=1;i<=m;i++)
{
f>>x>>y>>z;
if (x!=y)
{
p=new nod;
p->info=y;
p->cost=z;
p->urm=a[x];
a[x]=p;
p=new nod;
p->info=x;
p->cost=z;
p->urm=a[y];
a[y]=p;
}
}
d[s]=0;
for (i=1;i<=n;i++)
if (i!=s)
d[i]=inf;
m=1;
h[1]=s;
poz[s]=1;
k=1;
while (k<n)
{
min=h[1];
p=a[h[1]];
sterg ();
while (p)
{
if (d[p->info]==inf)
{
d[p->info]=p->cost+d[min];
adauga (p->info);
}
else
if (d[p->info]>d[min]+p->cost)
{
d[p->info]=d[min]+p->cost;
sss (poz[p->info]);
}
p=p->urm;
}
k++;
}
ok=0;
for (i=1;i<=n;i++)
if (i!=s)
if (d[i]!=df[i])
ok=1;
if (ok==0)
g<<"DA"<<"\n";
else
g<<"NU"<<"\n";
}
return 0;
}