題意:給定一顆無向帶權樹,要你找出乙個節點作為根,向葉子節點流水,使流水量最大。
二次掃瞄與換根法的入門題。
設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...