记忆化搜索,f[u,k]表示到节点u时,剩下k次失控的机会,所能得到的最大快乐值.
f[u,k]=max{f[v,k]+w[u,v]}
f[u,k]=min(f[u,k],f[v,k-1]+w[u,v]) (v是u的儿子)
/**************************************************************
Problem: 1916
User: exponent
Language: Pascal
Result: Accepted
Time:996 ms
Memory:6868 kb
****************************************************************/
type edge=record
v,w,n:longint;
end;
const maxm=150001;
maxn=50001;
maxk=11;
var e:array[0..maxm] of edge;
h:array[0..maxn] of longint;
f:array[0..maxn,0..maxk] of int64;
n,m,k,i,cnt,u,v,w:longint;
procedure add(u,v,w:longint);
begin
inc(cnt);
e[cnt].v:=v;
e[cnt].w:=w;
e[cnt].n:=h[u];
h[u]:=cnt;
end;
function min(a,b:int64):int64;
begin
if a>b then exit(b); exit(a);
end;
function max(a,b:int64):int64;
begin
if a>b then exit(a); exit(b);
end;
function calc(a,u,r:longint):int64;
var v,p:longint;
tmp:int64;
begin
if f[u,r]>0 then exit(f[u,r]);
p:=h[u];
tmp:=0;
while p<>0 do
begin
v:=e[p].v;
if v<>a then
tmp:=max(tmp,calc(u,v,r)+e[p].w);
p:=e[p].n;
end;
if r>0 then
begin
p:=h[u];
while p<>0 do
begin
v:=e[p].v;
if v<>a then
tmp:=min(tmp,calc(u,v,r-1)+e[p].w);
p:=e[p].n;
end;
end;
f[u,r]:=tmp;
exit(tmp);
end;
begin
readln(n,m,k);
for i:=1 to m do
begin
readln(u,v,w);
add(u,v,w);
end;
writeln(calc(0,1,k));
end.
浙公网安备 33010602011771号