洛谷P1272 重建道路

2022-03-01 06:17:57 字數 1494 閱讀 4031

一場可怕的**後,人們用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 21 3

1 41 5

2 62 7

2 84 9

4 10

4 11

輸出樣例#1:

2

【樣例解釋】

如果道路1-4和1-5被破壞,含有節點(1,2,3,6,7,8)的子樹將被分離出來

樹形一類有依賴的揹包問題都是又套路的呵呵ε=(・д・`*)ハァ…。f[k][i][j]表示以i為根的子樹到了第k個兒子保留j個節點所刪的邊。然後轉移方程是f[k][i][j]=max(f[k][i][j],f[k-1][i][j-v-1]+f[son[to]][to][v]);

j-v-1是因為根節點要保留。然後發現第一維是可以滾動掉的,j倒著列舉就行了。滾動之後f[i][1]=du[i];(只保留第i個節點當然是刪掉與i所連的邊啊)。

#include#include

#include

#include

#include

using

namespace

std;

inline

void read(int &x)

}const

int maxn=150+5

;const

int inf=0x3f3f3f3f

;int n,p,tot,ans=inf;

inthead[maxn],f[maxn][maxn],du[maxn];

struct

nodee[maxn

<<1

];inline

void ins(int

from,int

to)void dfs(int x,int

fa) ans=min(ans,f[x][p]);

}

intmain()

memset(f,

0x3f,sizeof

(f));

dfs(

1,-1

); printf(

"%d\n

",ans);

return0;

}

洛谷 P1272 重建道路

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

洛谷 P1272 重建道路

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

洛谷P1272 重建道路

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