洛谷P1271 重建道路

2021-09-29 04:04:40 字數 956 閱讀 6988

題面:

這題是一道樹形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...