P1272 重建道路

2022-05-24 06:54:10 字數 1041 閱讀 5158

一開始狀態定義錯了……所以沒有對qwq,以及有幾個坑qwq……

首先 f [ i ] [ j ] 表示以 i 為根的子樹,切除 j 個節點所需要切除的最小邊數,而我一開始定義的是表示以 i 為根的子樹,切除後生成一顆有 j 個節點的子樹,所需要切除的最小邊數。

為什麼我的不行吶?因為對於乙個新的子節點更新狀態,它能生成多大的子樹其實是和父親節點是沒有關係的,即它與父親節點原來的狀態無關也,兩棵樹不也連通,然而對於切除多少點,我們在意的是切除後剩的,而不是切除的。那麼最後的ans就是 f [ ... ] [ num - p ] + f [ ... ] [ num [ ... ] ]了。 

以及,根節點的 f [ ] num是0,因為它沒有父親節點本身就是一顆含有 num 個點的(子)樹。

**如下:

#include#include

#include

#include

using

namespace

std;

#define maxn 2000

struct

node

edge[maxn];

intf[maxn][maxn],num[maxn],head[maxn];

int n,p,cnt,ans=999999999

;void add(int a,int

b)void dfs(int u,int

fa) f[u][num[u]]=1

; f[u][

0]=0

;

if(u==1) f[u][num[u]]=0;}

void dp(int u,int

fa)

if(num[u]>=p)

ans=min(ans,f[u][num[u]-p]+f[u][num[u]]);

}int

main()

dfs(

1,0);

dp(1,0);

printf("%d

",ans);

return0;

}

P1272 重建道路

p1272 重建道路 題意 有一棵n個點的樹,求刪掉最少的邊數,使得其中p個點的子樹和另一部分分離 dp i j 表示編號為i的點周圍組成j個點的樹最少要刪的邊數 初始狀態 dp i 1 連線這個點的邊數 每個點都是點數為1的樹 然後去考慮連線兩個點,使子樹的點數增多。有兩個點數都是1的樹dp i ...

P1272 重建道路

lin klink link 這道題出的其實挺好的 顯然是乙個樹形dpdp dp問題最開始想複雜了 後來發現很簡單 一直以為是n 3做法 我們用dpu k dp dp u,k 表示在以u uu為根的子樹中,剔除k kk個的最小需要切的邊數 那麼初值就是dpu 1 d uu dp du u dpu,1...

洛谷 P1272 重建道路

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