BZOJ1907 樹的路徑覆蓋(貪心)

2021-08-08 17:05:07 字數 909 閱讀 2290

我是超連結

看上去像網路瘤題?嗯很明顯想多了,這可是一棵樹啊

然後陷入一臉不可做的狀態。。

翻翻翻…..

以某乙個點為根的子樹,這個點只有兩種狀態:拐彎(兩條簡單路徑在乙個點交匯成一條,折折折)和直上(一條路走到黑)

我們優先滿足拐彎的情況,貪心!貪心策略是:只要當前點能成為拐點,就讓它成為拐點。也就是說,貪心地將它能連的兒子連起來。因為乙個拐點可以使減少2個點,而拉上ta只能減少乙個點,所以這個貪心的策略是正確的。

我們對於每個點維護是否已經拐過彎了(因為只有沒拐過彎的節點才能繼續走到頂)

size[i]表示以i為根節點的子樹的最小路徑覆蓋

貌似還有一種樹形dp的方法?

#include 

#include

#include

#define n 10005

using

namespace

std;

int tot,nxt[n*2],point[n],v[n*2],size[n];bool vis[n];

void cl()

void addline(int x,int y)

void dfs(int x,int fa)

if (cnt>=2) size[x]-=2,vis[x]=true;//可以被當做乙個拐點,摺起來節點數-2

else

if (cnt==1) size[x]--;//只能和這個點一起走到頂

}int main()

dfs(1,0);

printf("%d\n",size[1]);}}

BZOJ1907 樹的路徑覆蓋

bzoj1907 其實挺sb 的乙個樹形dp 我這種sb 都會的樹形dp 我的做法很鬼畜。fx 0,f x,1 分別表示點 x 作為轉折點 也就是連成乙個 v字形 非轉折點,覆蓋該子樹的最小路徑數。記v 為x的兒子節點,su m m in f v,0,fv,1 mn mn 為fv 0 m in f ...

BZOJ 1907 樹的路徑覆蓋

題目描述 輸入 輸出樣例輸入 1 71 2 2 32 4 4 65 6 6 7 樣例輸出 3 題解 比較裸的樹形dp。對於任意節點x,只有三種情況,x單獨成鏈,x與子樹中的其中一條鏈成一條鏈,x與子樹中的兩條鏈成一條鏈。include include include define n 10010 d...

BZOJ 1907 樹的路徑覆蓋 樹形DP

題目大意 給定一棵樹,求最小路徑覆蓋 資料範圍1w,看到還想跑網路流來著 不過算了明明樹形dp這麼水還是不要用網路流這種大殺器為好 首先將所有的鏈都考慮成以鏈上所有點的lca為轉折點的v字形 那麼點有兩種 轉折點和非轉折點 因此我們選擇兩種狀態進行轉移 還會和父親組成鏈的狀態和成為轉折點的狀態 轉移...