Đề bài: http://vn.spoj.com/problems/DHFRBUS/
Thuật toán:
- Sử dụng thuật toán tìm đường đi ngắn nhất dijkstra.
- Gọi d[u,x] là quãng đường ngắn nhất đi từ s đến u khi dùng x vé xe miến phí
- Kết quả là d[t,k].
Code:
{$inline on}
const fi ='';
fo ='';
maxN =trunc(1e5)*2;
maxM =trunc(1e5)*10;
maxK =5;
oo =2*trunc(1e12);
type Tadj =record
v,w,link:int64;
end;
THeap =record
v1,v2:int64;
end;
Arr1 =array[0..maxN] of int64;
Arr2 =array[0..maxM] of Tadj;
Arr4 =array[0..maxN*maxK] of THeap;
Arr5 =array[0..maxN,0..maxK] of int64;
var n, m, k :longint;
Adj :arr2;
Head :arr1;
s, t :longint;
d :arr5;
Pos :arr5;
H :arr4;
nHeap :longint;
c :longint;
//heapmin;
procedure hv(var a, b:int64);
var tg :int64;
begin
tg:=a;a:=b;b:=tg;
end;
procedure UpHeap(i:longint);
begin
if (i<=1) or (d[H[i div 2].v1,H[i div 2].v2]<=d[H[i].v1,H[i].v2]) then exit;
hv(Pos[H[i div 2].v1,H[i div 2].v2],Pos[H[i].v1,H[i].v2]);
hv(H[i div 2].v1,H[i].v1);
hv(H[i div 2].v2,H[i].v2);
UpHeap(i div 2);
end;
procedure DownHeap(i:longint);
var j :longint;
begin
j:=i*2;
if j>nHeap then exit;
if (j0 do
begin
v:=adj[i].v;
w:=adj[i].w;
if d[v,x]>d[u,x]+w then
begin
d[v,x]:=d[u,x]+w;
Update(v,x);
end;
if (xd[u,x]) then
begin
d[v,x+1]:=d[u,x];
Update(v,x+1);
end;
i:=adj[i].link;
end;
until nHeap=0;
ans:=oo;
ans:=d[t,k];
{for x:=0 to k do
if d[t,x]
Recent Comments