POJ3585(二次掃瞄與換根法)

2021-10-02 05:19:48 字數 1021 閱讀 7556

題意:給定一顆無向帶權樹,要你找出乙個節點作為根,向葉子節點流水,使流水量最大。

二次掃瞄與換根法的入門題。

設d表示以1為根的情況下,每個節點向他的子樹流水量的最大值。

那麼可以得出轉移方程:

d [x

]=∑y

∈son

of

x\left\ min(d[y],edge(x,y)) & ,°[y]>1 \\ edge(x,y) &,°[y]=1 \end \right.

d[x]=y

∈son

ofx∑

​ min(\;\;f[fa]-min(d[x],edge)\;\;,edge)&,°[fa]>1\\ edge&,°[fa]=1 \end \right.

f[x]=d

[x]+

edge[maxn<<1]

;int head[maxn]

,top;

void

init

(int n)

void

add(

int u,

int v,

int w)

int d[maxn]

,f[maxn]

;//以root為根流向子樹的流量,以該節點為根流向所有節點的流量;

int du[maxn]

;voiddp(

int u,

int fa)

}void

dfs(

int u,

int fa,

int last)

}int

main()

dp(1,

0);dfs(1

,0,0

);int res=0;

for(

int i=

1;i<=n;

++i) res=

max(res,f[i]);

printf

("%d\n"

,res);}

return0;

}

poj3585 樹形dp二次換根

這道題如果用暴力的方法是列舉根節點,對每個根節點dfs下去,但是這樣肯定會t,需要用樹形dp優化一下。輔助陣列 d maxn f manx d i 代表以任意某個節點為根,i可以向其子節點流的最大流量。f i 代表以i為根節點時,最大流量。當我們以1為根節點時,明顯f 1 d 1 處理d i 陣列 ...

POJ3585 換根模板

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

poj3585樹最大流 換根法

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