#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 kde[10000]; int nh; int cmp(const void *q1,const void *q2){ hrana *p1=(hrana*)q1,*p2=(hrana*)q2; return(p1->z - p2->z); } int extract_min(void) { int ret=halda[1].uzel; int akt=1; hv pom=halda[nh]; halda[nh].cena=MOC+1; nh--; while (1) { int son=2*akt; if (halda[son+1].cena=pom.cena) { halda[akt]=halda[son]; kde[halda[akt].uzel]=akt; } else break; akt=son; } halda[akt]=pom; kde[halda[akt].uzel]=akt; return ret; } void decrease_key(int of,int val) { int akt=kde[of]; hv ul=halda[akt]; while (1) { int fat=akt/2; if (val>=halda[fat].cena) break; halda[akt]=halda[fat]; kde[halda[akt].uzel]=akt; akt=fat; } halda[akt]=ul; kde[halda[akt].uzel]=akt; halda[akt].cena=val; cena[of]=val; } int main(){ int i,j,k,s; 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=extract_min(); if (k==c) break; /* update */ for(j=zac[k];j=MOC) printf("%d\n",1/0);*/ if(cena[to] > cena[k] + hrany[j].cena) decrease_key(to,cena[k]+hrany[j].cena); } } printf("%d\n",cena[c]); } }