洛谷P1272 重建道路

2022-05-05 21:15:09 字數 1156 閱讀 5809

題目鏈結

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

顯然是一道樹形dp

然後看題解

樹上分組揹包問題

dp[u][i][j]表示以u為根的子樹中,前i個子樹中留下j個的最小花費

首先,dp[u][size[u]][1]=son_num[u]

以u為節點的子樹留下1個節點的花費為u的子樹個數

dp[u][i][j]=min(dp[u][i][j],dp[u][i-1][j-k]+dp[v][size[v]][k]-1);

i這一維可以滾動陣列滾掉

#include#include

#include

#define n 155

int n,p,dp[n][n],out[n],in

[n];

struct

node e[n];

inthead[n],num;

inline

void add(int x,int

y)inline

intread()

returnx;}

inline

int min(int a,int

b)int dfs(int

u) }

dp[u][sum]=0

;

return

sum;

}int

main()

intst;

for(int i=1;i<=n;i++)

if(!in

[i])

dfs(st);

int ans=0x7fffffff

;

for(int i=1;i<=n;i++)

ans=min(ans,dp[i][p]+(i==st?0: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 1 p n...