POJ3585 換根模板

2022-04-28 20:18:11 字數 1256 閱讀 7216

題意:機翻?

好,假裝各位都已經看懂了題。

首先是暴力,列舉每乙個點作為根,然後每次做乙個樹上dp,複雜度o(n2),t掉;

然後,我們考慮怎樣優化。

假設我們已經求出了x的答案,對與每乙個它的子節點,

我們注意到其實當我們換其子節點y為根時,y的子樹貢獻是已知的。

只需考慮另外一側的貢獻之間,

同時又注意到,除y以外的對x的貢獻就是x的答案減掉y對它的貢獻,也是一定的。

所以只有x會影響到y,直接根據限制在y和x之間轉移一下就好了。

#include #include 

#include

using

namespace

std;

inline

intgi ()

while (ch>='

0' && ch<='9'

)

return w?-x:x;

}const

int n=2e5+10

;int

t,n,tot,ans,head[n],f[n],deg[n],ind[n],vis[n],leaf[n];

struct

edge e[n

<<1

];inline

void make (int

from, int to, int

va)

void

new_case ()

void dp (int

k) leaf[k]=fl;

}void dfs (int

p)

if (ind[p]==1) f[k]=deg[k]+e[i].val;

else f[k]=deg[k]+min (e[i].val, f[p]-min (e[i].val, deg[k]) );

dfs (k);

}

}int

main ()

dp (1);

memset (vis,

0, sizeof

(vis) );

f[1]=deg[1

]; dfs (

1); //

換根for (int i=1;i<=n;++i)

ans=max (ans, f[i]);

printf (

"%d\n

", ans);

}return0;

}

poj3585樹最大流 換根法

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

poj3585 樹形dp二次換根

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

POJ3585(二次掃瞄與換根法)

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