Pagini recente » Cod sursa (job #2932100) | Cod sursa (job #716932) | Cod sursa (job #187299) | Cod sursa (job #2403526) | Cod sursa (job #2288324)
#include<stdio.h>
#define usi unsigned short int
const usi N=50001;
struct G {
usi o,c;
G *u;
};
G *g[N],*r;
int m;
usi n,k,t,i,h[N],d[N],f,w,u,p[N];
void U(usi w) {
for(;w>1&&d[h[w>>1]]>d[h[w]];w=f)
f=w>>1,h[w]^=h[f]^=h[w]^=h[f],p[h[w]]=w,p[h[f]]=f;
}
int main() {
freopen("dijkstra.in","r",stdin),freopen("dijkstra.out","w",stdout),scanf("%d%d",&n,&m);
while(m--) {
scanf("%d%d%d",&u,&w,&f);
r=new G;
r->o=w,r->c=f,r->u=g[u],g[u]=r;
}
for(i=2;i<=n;i++)
d[i]=p[i]=N;
for(p[1]=h[++k]=1;k;) {
for(t=h[1],h[1]=h[k--],p[h[1]]=w=1;w<=k;w=f) {
f=w<<1;
if(f>k)
break;
if(f<k&&d[h[f+1]]<d[h[f]])
f++;
if(d[h[w]]<=d[h[f]])
break;
h[w]^=h[f]^=h[w]^=h[f],p[h[w]]=w,p[h[f]]=f;
}
for(r=g[t];r;r=r->u) {
if(d[r->o]>d[t]+r->c) {
d[r->o]=d[t]+r->c;
if((t-r->o)*(h[t]-h[r->o])<0)
U(t);
//if(p[r->o]!=N)
// U(p[r->o]);
else
h[++k]=r->o,p[h[k]]=k,U(k);
}
}
}
for(i=2;i<=n;i++)
printf("%d ",d[i]==N?0:d[i]);
}