#include typedef struct { long kam; int vzd; long next; } ZAZNAM; ZAZNAM hrany[100001]; int vrch1[10001]; int vrch2[10001]; int poc[10001]; int done[10001]; int d[10001]; int ss[10001][2]; #define MAX 10000000 int n,m,s,c; int a,b,v; int i,udelanych,jj,j; int min,sous,ok; long free_hrana; int main(void) { scanf("%d%d%d%d", &n, &m, &s, &c); while (n) { for (i=1;i<=n;i++) { poc[i]=0; done[i]=0; d[i]=MAX; vrch1[i]=0; /*vrch2[i]=0;*/ ss[i][0]=i-1; ss[i][1]=i+1; } free_hrana=1; for (jj=0;jj v) hrany[i].vzd=v; } else {*/ /* nove */ hrany[free_hrana].kam=b; hrany[free_hrana].vzd=v; hrany[free_hrana].next=0; hrany[vrch2[a]].next=free_hrana; vrch2[a]=free_hrana; free_hrana++; /* } */ } if (vrch1[b] == 0) { hrany[free_hrana].kam=a; hrany[free_hrana].vzd=v; hrany[free_hrana].next=0; vrch1[b]=free_hrana; vrch2[b]=free_hrana; free_hrana++; } else { /* exist ? */ i=vrch1[b]; /* while (hrany[i].kam != a && hrany[i].next != 0) i=hrany[i].next; if (hrany[i].kam == a) { if (hrany[i].vzd > v) hrany[i].vzd=v; } else {*/ /* nove */ hrany[free_hrana].kam=a; hrany[free_hrana].vzd=v; hrany[free_hrana].next=0; hrany[vrch2[b]].next=free_hrana; vrch2[a]=free_hrana; free_hrana++; /* } */ } } /* for (i=1;i<=n;i++) { printf("%d: ", i); j=vrch1[i]; while (j!=0) { printf("%ld(%d) ", hrany[j].kam,hrany[j].vzd); j=hrany[j].next; } puts(""); } */ d[s]=0; done[s]=1; ss[ss[s][0]][1]=ss[s][1]; ss[ss[s][1]][0]=ss[s][0]; i=vrch1[s]; while (i) { d[hrany[i].kam]=hrany[i].vzd; i=hrany[i].next; } udelanych=1; while (!done[c] && udelanych < n) { for (i=1;i<=n;i++) { if (!done[i]) break; } min=i; for (;i<=n;i=ss[i][1]) { if (d[i] < d[min]) min=i; } ss[ss[min][0]][1]=ss[min][1]; ss[ss[min][1]][0]=ss[min][0]; done[min]=1; udelanych++; i=vrch1[min]; while (i) { sous=hrany[i].kam; if (!done[sous] && d[min]+hrany[min].vzd < d[sous]) d[sous]=d[min]+hrany[min].vzd; i=hrany[i].next; } } if (!done[c]) printf("???\n"); else printf("%d\n", d[c]); scanf("%d%d%d%d", &n, &m, &s, &c); } return(0); }