P1272 重建道路

2021-10-23 05:53:34 字數 1471 閱讀 2091

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​

=duu

​轉移就是

d pu

,k

=min⁡,

v∈so

n(u)

,j≤k

dp_=\min\+dp_-2\},v\in son(u) ,j\leq k

dpu,k​

=min,v

∈son

(u),

j≤k注意我們為什麼需要−2-2

−2呢,因為我們在u,v

u,vu,

v這裡先是預設把他刪掉了,然後我們再把他連上,所以要−2-2

−2答案就是min

⁡\min\\}

min其實就是揹包嘛

#include

using

namespace std;

# define rep(i,a,b) for(int i=a;i<=b;i++)

# define _rep(i,a,b) for(int i=a;i>=b;i--)

# define repg(i,u) for(int i=head[u];~i;i=e[i].next)

typedef

long

long ll;

const

int n=

205;

template

<

typename t>

void

read

(t &x)

int n,p;

int head[n]

,cnt;

int f[n]

[n],ans=int_max;

int siz[n]

,du[n]

;struct edgee[n*n]

;void

add(

int x,

int y)

,head[x]

=cnt;

}void

dfs(

int u,

int fa)

ans=

min(ans,f[u]

[p]);}

intmain()

dfs(1,

0);printf

("%d\n"

,ans)

;return0;

}

P1272 重建道路

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

P1272 重建道路

一開始狀態定義錯了 所以沒有對qwq,以及有幾個坑qwq 首先 f i j 表示以 i 為根的子樹,切除 j 個節點所需要切除的最小邊數,而我一開始定義的是表示以 i 為根的子樹,切除後生成一顆有 j 個節點的子樹,所需要切除的最小邊數。為什麼我的不行吶?因為對於乙個新的子節點更新狀態,它能生成多大...

洛谷 P1272 重建道路

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