Function hash(S:String):longint; var i:longint; begin hash:=0; for i:=1 to length(s) do hash:=(hash*131+ord(s[i])) and $FFFFFFFF; hash:=hash and $7fffffff; end; Procedure getpi; var k,i:longint; begin pi[1]:=0; k:=0; for i:=2 to m do begin while (k>0) and (b[i]<>b[k+1]) do k:=pi[k]; if b[i]=b[k+1] then inc(k); pi[i]:=k; end; end; Procedure KMP; var k,i:longint; begin k:=0; for i:=1 to n do begin while (k>0) and (b[k+1]<>a[i]) do k:=pi[k]; if b[k+1]=a[i] then inc(k); if k=m then writeln('From ',i-m+1,' to ',i); end; end; //前向星+slf优化 { Author:HT Date:2012/11/09 } Procedure Spfa(ST:longint); var i,close,open,x:longint; v:array[0..30002] of boolean; q:array[0..30002] of longint; begin fillchar(dt,sizeof(dt),$7f); dt[st]:=0; fillchar(v,sizeof(v),false); q[1]:=st; v[st]:=true; close:=0; open:=1; while close<>open do begin close:=close mod n+1; x:=q[close]; for i:=pre[x] to tail[x] do if dt[b[i].ed]>dt[x]+b[i].w then begin dt[b[i].ed]:=dt[x]+b[i].w; if not v[b[i].ed] then begin v[b[i].ed]:=true; if dt[b[i].ed]<=dt[x] then//SLF begin q[close]:=b[i].ed; close:=close-1; if close<1 then close:=n; end else begin open:=open mod n +1; q[open]:=b[i].ed; end; end; end; v[x]:=false; end; end; Procedure qsort(l,r:longint); var i,j:longint; x,y:rec; begin i:=l;j:=r;x:=b[(l+r) div 2]; repeat while b[i].st<x.st do inc(i); while b[j].st>x.st do dec(j); if i<=j then begin y:=b[i]; b[i]:=b[j]; b[j]:=y; inc(i); dec(j); end; until i>j; if l<j then qsort(l,j); if i<r then qsort(i,r); end; Procedure lsh; var i:longint; begin fillchar(pre,sizeof(pre),$7f); fillchar(tail,sizeof(tail),0); for i:=1 to 2*m do begin if pre[b[i].st]>1e8 then pre[b[i].st]:=i; tail[b[i].st]:=i; end; end; begin fopen; readln(n,m,ts,te); for i:=1 to m do begin with b[i*2] do readln(st,ed,w); with b[i*2-1] do begin st:=b[i*2].ed; ed:=b[i*2].st; w:=b[i*2].w; end; end; qsort(1,2*m); lsh; spfa(ts); writeln(dt[te]); fclose; end. //-------------------------------------------- //heap Procedure swap(var a,b:longint); var y:longint; begin y:=a;a:=b;b:=y; end; Procedure down(P:longint); var o:longint; begin //writeln('down(',p,') top=',top); if p*2>top then exit; o:=p; if p*2=top then begin if a[p]>a[p*2] then swap(a[p],a[p*2]) end else begin if a[o]>a[p*2] then o:=p*2; if a[o]>a[p*2+1] then o:=p*2+1; swap(a[p],a[o]); if o<>p then down(o); end; end; Procedure up(P:longint); begin while p>1 do if a[p]<a[p div 2] then begin a[p div 2]:=a[p]; p:=p div 2 end else break; end; Procedure insert(P:longint); begin inc(top); a[top]:=p; up(top); end; Function Delete:longint; begin delete:=a[1]; swap(a[1],a[top]); dec(top); down(1); end;