#include #include int n,m,s,c; #define MOC 1000000000 typedef struct { int z,kam,cena; }hrana; typedef struct { int uzel; int cena; } hv; hrana hrany[50000]; hv halda[41000]; int zac[55000]; int cena[10000]; int docas[10000]; int kde[10000]; int cmp(const void *q1,const void *q2){ hrana *p1=(hrana*)q1,*p2=(hrana*)q2; return(p1->z - p2->z); } int main(){ int i,j,k,mn,s,nh,cont; hv sh; while(1){ scanf("%d%d%d%d",&n,&m,&s,&c); if(n==0) return 0; s--;c--; for(i=0;i %d\n", halda[xxx].uzel,halda[xxx].cena); } printf("--------\n");*/ k=halda[1].uzel; /* delete */ docas[k]=0; halda[1]=halda[nh]; kde[halda[1].uzel]=1; i=1; halda[nh--].cena=MOC+1; cont=1; do{ if(halda[2*i].cena<=halda[2*i+1].cena) mn=2*i; else mn=2*i+1; if(halda[i].cena>halda[mn].cena){ sh=halda[i]; halda[i]=halda[mn]; halda[mn]=sh; kde[halda[i].uzel]=i; kde[halda[mn].uzel]=mn; }else cont=0; }while(cont); /* update */ for(j=zac[k];j= cena[k] + hrany[j].cena){ i=kde[hrany[j].kam]; cena[hrany[j].kam] = cena[k] + hrany[j].cena; halda[i].cena=cena[hrany[j].kam]; while(halda[i].cena < halda[i/2].cena){ sh=halda[i]; halda[i]=halda[i/2]; halda[i/2]=sh; kde[halda[i].uzel]=i; kde[halda[i/2].uzel]=i/2; } } } } printf("%d\n",cena[c]); } }