題目大意:給定一棵樹,求最小路徑覆蓋
資料範圍1w,看到還想跑網路流來著= = 不過算了明明樹形dp這麼水還是不要用網路流這種大殺器為好
首先將所有的鏈都考慮成以鏈上所有點的lca為轉折點的v字形
那麼點有兩種:轉折點和非轉折點
因此我們選擇兩種狀態進行轉移:還會和父親組成鏈的狀態和成為轉折點的狀態
轉移就自己yy算了
時間複雜度是線性的
#include #include #include #include #define m 10100
using namespace std;
struct abcdtable[m<<1];
int head[m],tot;
int n,f[m][2];
//0-ここでは終わり
//1-まで続いている
void add(int x,int y)
void initialize()
void tree_dp(int x,int from)
}int main()
{ int t,i,x,y;
for(cin>>t;t;t--)
{ initialize();
cin>>n;
for(i=1;i
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...
BZOJ1907 樹的路徑覆蓋(貪心)
我是超連結 看上去像網路瘤題?嗯很明顯想多了,這可是一棵樹啊 然後陷入一臉不可做的狀態。翻翻翻 以某乙個點為根的子樹,這個點只有兩種狀態 拐彎 兩條簡單路徑在乙個點交匯成一條,折折折 和直上 一條路走到黑 我們優先滿足拐彎的情況,貪心!貪心策略是 只要當前點能成為拐點,就讓它成為拐點。也就是說,貪心...