Pagini recente » Cod sursa (job #2809548) | Cod sursa (job #2440271) | Cod sursa (job #2277303) | Cod sursa (job #2539941) | Cod sursa (job #278746)
Cod sursa(job #278746)
#include<stdio.h>
using namespace std;
typedef struct nod
{
long info;
long dist;
nod *next;
}*pnod;
pnod prim[50002],pp;
long int n,m,i,a,b,c,i8,lh,nv,dv,nn,dn,aux;
long int h[50002],ph[50002],d[50002],viz[50002];
void add(pnod &p,long j,long c)
{
nod *q=new nod;
q->info=b;
q->dist=c;
q->next=p;
p=q;
}
void read()
{
scanf("%ld %ld",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%ld %ld %ld",&a,&b,&c);
add(prim[a],b,c);
}
}
/*void sh(long int i1,long int i2)
{
}*/
void hd(long int ic)
{
long int is,is1;
is=ic<<1;
is1=is|1;
if(is>lh)
return;
if(is<lh)
if(d[h[is1]]<d[h[is]])
is=is1;
if(d[h[is]]<d[h[ic]])
{
//sh(is,ic);
aux=h[i1];
h[i1]=h[i2];
h[i2]=aux;
ph[h[i1]]=i1;
ph[h[i2]]=i2;
hd(is);
}
}
void hu(long int ic)
{
long int is;
is=ic>>1;
if(!is)
return;
if(d[h[is]]>d[h[ic]])
{
//sh(is,ic);
aux=h[i1];
h[i1]=h[i2];
h[i2]=aux;
ph[h[i1]]=i1;
ph[h[i2]]=i2;
hu(is);
}
}
void dijkstra()
{
i8=1000000000;
for(i=1;i<=n;i++)
{
h[i]=i;
ph[i]=i;
d[i]=i8;
}
d[1]=0;
lh=n;
while(lh && d[h[1]]<i8)
{
nv=h[1];
viz[nv]=1;
dv=d[nv];
h[1]=h[lh];
ph[h[1]]=1;
lh--;
hd(1);
pp=prim[nv];
while(pp)
{
if(viz[pp->info])
pp=pp->next;
else
{
if(d[pp->info]>dv+pp->dist)
{
d[pp->info]=dv+pp->dist;
hu(ph[pp->info]);
}
pp=pp->next;
}
}
}
}
int main()
{
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
read();
dijkstra();
for(i=2;i<=n;i++)
{
if(d[i]==i8)
d[i]=0;
printf("%ld ",d[i]);
}
printf("\n");
return 0;
}