洛谷 P1272 重建道路

题目描述

一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场。由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的。因此,牧场运输系统可以被构建成一棵树。John想要知道另一次地震会造成多严重的破坏。有些道路一旦被毁坏,就会使一棵含有P(1≤P≤N)个牲口棚的子树和剩余的牲口棚分离,John想知道这些道路的最小数目。

输入输出格式

输入格式:
第1行:2个整数,N和P

第2..N行:每行2个整数I和J,表示节点I是节点J的父节点。

输出格式:
单独一行,包含一旦被破坏将分离出恰含P个节点的子树的道路的最小数目。

输入输出样例

输入样例#1:
11 6
1 2
1 3
1 4
1 5
2 6
2 7
2 8
4 9
4 10
4 11
输出样例#1:
2
说明

【样例解释】

如果道路1-4和1-5被破坏,含有节点(1,2,3,6,7,8)的子树将被分离出来

program df;
type point=^node;
node=record
ends:longint;
next:point;
end;
var i,j,n,m,x,y,z,k,t:longint;
c,d:array[0..100000] of longint;
f:array[0..150,0..150] of longint;
path:array[0..100000] of point;
function min(x,y:longint):longint;
begin
if x>y then exit(y)
else exit(x);
end;

procedure com(x,y:longint);
var i:point;
begin
i:=path[x];
new(path[x]);
path[x]^.ends:=y;
path[x]^.next:=i;
end;

procedure dfs(x:longint);
var i:point;
y,j,k,t:longint;
begin
f[x,1]:=d[x];
i:=path[x];
while i<>nil do
begin
y:=i^.ends;
dfs(y);
for j:=m downto 2 do
for k:=1 to j-1 do
f[x,j]:=min(f[x,j],f[x,j-k]+f[y,k]-2);
i:=i^.next;
end;
end;

begin
readln(n,m);
for i:=1 to n-1 do
begin
readln(x,y);
com(x,y);
inc(d[x]);
inc(d[y]);
end;
fillchar(f,sizeof(f),$3f);
dfs(1);
t:=f[0,0];
for i:=1 to n do
if t>f[i,m] then t:=f[i,m];
writeln(t);
end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值