題面:
這題是一道樹形dp
設dp[i][j]表示以i為根的節點保留j個點所需要砍掉的邊數,cnt[i]為i的子節點數,size[i]表示以i為根的子樹的節點數
則可以得到初始狀態:
dp[i][1]=cnt[i](只留下根節點則需要把所有與子節點的連邊砍掉);dp[i][0]=0;
otherwise, dp[i][j]=inf(極大值)
對於每乙個子節點,我們可以分配一定的點數給它,則有狀態轉移方程:
dp[i][j]=min(dp[i][j],dp[i][k]+dp[s][j-k]-1) (1<=i<=n;0<=j<=size[i];1<=k其餘細節見程式注釋
#include#include#include#define maxn 151
using namespace std;
int n,p;
int root;
int ans;
bool bj[maxn];
int size[maxn],cnt[maxn],dp[maxn][maxn];
int head[maxn],h;
struct edge
edge[maxn];
void add(int u,int v)
void dfs(int u)
} }}int main()
memset(dp,63,sizeof(dp));
for(int i=1;i<=n;i++) }
dfs(root);
ans=dp[root][p];
for(int i=1;i<=n;i++) ans=min(ans,dp[i][p]+1);
//根據我們的狀態定義,我們求得只是該子樹保留p個節點所需要砍的邊
//因此,除了根節點,都還需要再斷開該節點與其父節點的連邊
cout<}
洛谷 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 1 p n...