樹的路徑覆蓋

2021-07-08 12:54:08 字數 1091 閱讀 4970

description

給一棵樹, 用最少的路徑去覆蓋所有的邊, 求(1)允許邊被重複覆蓋, (2)不允許邊被重複覆蓋.

input

第一行是組數t(t <= 20). 每組兩行, 第一行是n(1 <= n <= 10^5), 第二行是n - 1個數(0-based), 第i個數x[i]表示有一條邊(x[i], i + 1), (0 <= i <= n - 2).

output

兩個值,第乙個值是允許邊被重複覆蓋情況下的答案,第二個值是不允許邊被重複覆蓋下的答案,用乙個空格分隔.

sample input

2

1

7

0 0 1 1 2 2

sample output

0 0

2 3

#include #include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

const int m = 100005;

const double esp = 1e-6;

const int inf = 0x3f3f3f3f;

const double pi = 3.141592653589793;

using namespace std;

vectorarr[m];

int ans,cnt,dis[m];

void dfs(int u,int p,int f)

ans += (sum - f + 1) / 2;

}int main()

for(int i=1,j;ians = cnt = 0;

for(int i=0;i}

if(n == 1)

else

dfs(0,0,0);

//允許邊被重複覆蓋的可能有 : (葉子節點的數目)/2

printf("%d %d\n",cnt,ans);

}return 0;

}

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 樹的路徑覆蓋(貪心)

我是超連結 看上去像網路瘤題?嗯很明顯想多了,這可是一棵樹啊 然後陷入一臉不可做的狀態。翻翻翻 以某乙個點為根的子樹,這個點只有兩種狀態 拐彎 兩條簡單路徑在乙個點交匯成一條,折折折 和直上 一條路走到黑 我們優先滿足拐彎的情況,貪心!貪心策略是 只要當前點能成為拐點,就讓它成為拐點。也就是說,貪心...