类似于2763,不过层与层之间的边权要改为原边权的一半。我直接改了这个细节贴2763的代码了。
program p2662; type bian=record next,point,w:longint; end; heap=record dis,point:longint; end; var p,d:array[1..200000] of longint; x:array[1..200000] of heap; b:array[1..1500000] of bian; ans,len,s,t,n,m,k,i,j,k1,k2,k3,maxn:longint; now:heap; procedure ade(k1,k2,k3:longint); begin inc(len); b[len].point:=k2; b[len].w:=k3; b[len].next:=p[k1]; p[k1]:=len; end; procedure add(k1,k2,k3:longint); begin ade(k1,k2,k3); ade(k2,k1,k3); end; function minn(k1,k2:longint):longint; begin if x[k1].dis<=x[k2].dis then exit(k1) else exit(k2); end; function min(k1,k2,k3:longint):longint; begin exit(minn(k1,minn(k2,k3))); end; procedure press(k:longint); var i:longint; j:heap; begin i:=min(k,k*2,k*2+1); if i=k then exit; j:=x[k]; x[k]:=x[i]; x[i]:=j; press(i); end; procedure find(k:longint); var i:heap; begin if k=1 then exit; if x[k].dis<x[k div 2].dis then begin i:=x[k]; x[k]:=x[k div 2]; x[k div 2]:=i; find(k div 2); end; end; procedure push(k:heap); var i,j:longint; begin i:=p[k.point]; while i<>0 do begin j:=b[i].point; if k.dis+b[i].w<d[j] then begin d[j]:=k.dis+b[i].w; inc(len); x[len].point:=j; x[len].dis:=d[j]; find(len); end; i:=b[i].next; end; end; begin readln(n,m,k); len:=0; fillchar(p,sizeof(p),0); fillchar(b,sizeof(b),0); for i:=1 to m do begin readln(k1,k2,k3); add(k1,k2,k3); for j:=0 to k-1 do begin ade(j*n+k1,j*n+n+k2,k3 div 2); ade(j*n+k2,j*n+k1+n,k3 div 2); add(j*n+n+k1,j*n+n+k2,k3); end; end; fillchar(d,sizeof(d),$3f); fillchar(x,sizeof(x),$7f); maxn:=x[1].dis; s:=1; t:=n; len:=1; x[1].point:=s; d[s]:=0; x[1].dis:=0; while len>0 do begin dec(len); now:=x[1]; if len>0 then begin x[1]:=x[len+1]; x[len+1].dis:=maxn; press(1); end; push(now); end; ans:=maxlongint; for i:=0 to k do if d[i*n+t]<ans then ans:=d[i*n+t]; writeln(ans); end.