poj3585 樹形dp二次換根

2021-09-11 14:03:54 字數 1295 閱讀 6647

這道題如果用暴力的方法是列舉根節點,對每個根節點dfs下去,但是這樣肯定會t,需要用樹形dp優化一下。

輔助陣列:d[maxn], f[manx];

d[i]:代表以任意某個節點為根,i可以向其子節點流的最大流量。

f[i]:代表以i為根節點時,最大流量。

當我們以1為根節點時,明顯f[1] = d[1];

處理d【i】陣列:一遍dfs就行。

關鍵在於如何求f【i】?

我們可以知道f[i] = d[i] + (i通向父節點的那條路最多可以流的流量)

假設i的父節點為y, y到i的通路流量為c

實際上就是min(f[y]-min(d[i], c), c):父節點在別的子節點的流量和與c取min。

#pragma gcc optimize(2)

#include

#include

using namespace std;

typedef

long

long ll;

const

int maxn =

2e5+5;

const

int mod =

1e9+9;

int case =1;

int n, m, tot, deg[maxn]

, d[maxn]

, f[maxn]

, head[maxn]

;struct nodenode[maxn<<1]

;void

add(

int x,

int y,

int v)

void

init()

tot =0;

}void

dfs1

(int u,

int fa)

}void

dfs2

(int u,

int fa)

}void

solve()

dfs1(1

,-1)

; f[1]

= d[1]

;dfs2(1

,-1)

;int res =0;

for(

int i =

1; i <= n; i++

) res =

max(res, f[i]);

printf

("%d\n"

, res)

;return;}

intmain()

return0;

}

POJ3585(二次掃瞄與換根法)

題意 給定一顆無向帶權樹,要你找出乙個節點作為根,向葉子節點流水,使流水量最大。二次掃瞄與換根法的入門題。設d表示以1為根的情況下,每個節點向他的子樹流水量的最大值。那麼可以得出轉移方程 d x y son of x left min d y edge x,y y 1 edge x,y y 1 en...

POJ3585 換根模板

題意 機翻?好,假裝各位都已經看懂了題。首先是暴力,列舉每乙個點作為根,然後每次做乙個樹上dp,複雜度o n2 掉 然後,我們考慮怎樣優化。假設我們已經求出了 的答案,對與每乙個它的子節點,我們注意到其實當我們換其子節點 為根時,的子樹貢獻是已知的。只需考慮另外一側的貢獻之間,同時又注意到,除 以外...

poj3585樹最大流 換根法

題目 二次掃瞄與換根法,一次dfs求出以某個節點為根的相關值,再dfs遍歷一遍樹,根據之前的值換根取最大值為答案。如下 include include include using namespace std int n,head 200005 ct,d 200005 f 200005 deg 200...