Pagini recente » Borderou de evaluare (job #541922) | Borderou de evaluare (job #2031041) | Borderou de evaluare (job #1996957) | Borderou de evaluare (job #1211404) | Cod sursa (job #558996)
Cod sursa(job #558996)
#include<fstream>
using namespace std;
int t,a,b,c,n,m,i,j,sursa,D[50005],d[50005],poz[50005],minim,k,sw,h[50005];
const int inf=1<<30;
typedef
struct nod
{
int nr, cost;
nod*urm;
}*Pnod;
Pnod l[50005];
void jos()
{
int caut=1,fiu,aux;;
do{
fiu=0;
if(caut*2<=k)
{
fiu=caut*2;
if((caut*2+1)<=k&&d[h[caut*2]]>d[h[(caut*2)+1]])
fiu=(caut*2)+1;
if(d[h[fiu]]>=d[h[caut]])
fiu=0;
}
if(fiu!=0)
{
aux=h[caut];
h[caut]=h[fiu];
h[fiu]=aux;
poz[h[caut]]=caut;
poz[h[fiu]]=fiu;
caut=fiu;
}
}while(fiu!=0);
}
void sus(int caut)
{
int aux;
while((caut>1)&&(d[h[caut]]<d[h[caut/2]]))
{
poz[h[caut]]=caut/2;;
poz[h[caut/2]]=caut;;
aux=h[caut];
h[caut]=h[caut/2];
h[caut/2]=aux;
caut=caut/2;
}
}
void sterg()
{
h[1]=h[k];
poz[h[k]]=1;
k--;
if(k!=0)
jos();
}
void dijstra()
{
for(i=1;i<=n;i++)
{
d[i]=inf;
poz[i]=0;
}
poz[sursa]=1;
Pnod p;
d[sursa]=0;
k++;
h[k]=sursa;
minim=sursa;
while(k!=0)
{
minim=h[1];
sterg();
for(p=l[minim];p!=NULL;p=p->urm)
if(d[p->nr]>d[minim]+p->cost)
{
d[p->nr]=d[minim]+p->cost;
if(poz[p->nr]==0)
{
k++;
h[k]=p->nr;
poz[p->nr]=k;
}
else
sus(poz[p->nr]);
}
}
}
int main()
{
ifstream fin("distante.in");
ofstream fout("distante.out");
fin>>t;
Pnod p;
int r;
for(r=1;r<=t;r++)
{
fin>>n>>m>>sursa;
sw=0;
for(j=1;j<=n;j++)
{
l[j]=NULL;
fin>>D[j];
}
for(j=1;j<=m;j++)
{
fin>>a>>b>>c;
p=new(nod);
p->nr=a;
p->cost=c;
p->urm=l[b];
l[b]=p;
p=new(nod);
p->nr=b;
p->cost=c;
p->urm=l[a];
l[a]=p;
}
dijstra();
for(j=1;j<=n;j++)
if(d[j]!=D[j])
sw++;
if(sw==0)
fout<<"DA"<<'\n';
else fout<<"NU"<<'\n';
}
fin.close();
fout.close();
return 0;
}