題目描述
一場可怕的**後,人們用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.
洛谷 P1272 重建道路
題目描述 一場可怕的 後,人們用n個牲口棚 1 n 150,編號1.n 重建了農夫john的牧場。由於人們沒有時間建設多餘的道路,所以現在從乙個牲口棚到另乙個牲口棚的道路是惟一的。因此,牧場運輸系統可以被構建成一棵樹。john想要知道另一次 會造成多嚴重的破壞。有些道路一旦被毀壞,就會使一棵含有p ...
洛谷P1272 重建道路
一場可怕的 後,人們用n個牲口棚 1 n 150,編號1.n 重建了農夫john的牧場。由於人們沒有時間建設多餘的道路,所以現在從乙個牲口棚到另乙個牲口棚的道路是惟一的。因此,牧場運輸系統可以被構建成一棵樹。john想要知道另一次 會造成多嚴重的破壞。有些道路一旦被毀壞,就會使一棵含有p 1 p n...
洛谷P1272 重建道路
題目鏈結 一場可怕的 後,人們用n個牲口棚 1 n 150,編號1.n 重建了農夫john的牧場。由於人們沒有時間建設多餘的道路,所以現在從乙個牲口棚到另乙個牲口棚的道路是惟一的。因此,牧場運輸系統可以被構建成一棵樹。john想要知道另一次 會造成多嚴重的破壞。有些道路一旦被毀壞,就會使一棵含有p ...