Luogu1272 重建道路(動態規劃)

2022-03-20 08:43:43 字數 1125 閱讀 9058

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

樹型dp

設\(f[i][j]\)表示當前以\(i\)為根節點,保留\(j\)個節點的最小代價

轉移有所有子樹的值轉移過來

其中\(f[i][1]=degree[i]\),其中\(degree\)表示出度

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define max 300

inline int read()

struct line

e[max<<1];

int lk[max];

int h[max],cnt=1;

int size[max],n,p,ans=1e9;

inline void add(int u,int v)

; h[u]=cnt++;lk[u]++;

}int f[max][max];

void dfs(int u,int ff)

ans=min(ans,f[u][p]+(ff!=0));

}int main()

memset(f,63,sizeof(f));

dfs(1,0);

cout

}

Luogu1272 重建道路 樹形dp

lin k frak link 求樹上有p個點的連通塊數目。求刪除最少多少條邊之後能夠讓樹上出現有p個點的連通塊 考慮點x保留k個點要剪掉的最少邊數 那麼f x,k min yi k 注意在統計非根節點的時候要剪掉連向父親的邊。include include include include incl...

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...