#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;ihalda[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]); } }