[换根] Accumulation Degree
題面
link
 ??給定一棵樹,每條邊有流量限制,一個結點的流量定義為將該點看為源點,最多能流出多少水(可以從不是自身的葉子結點流出),問這棵樹最大的結點流量是多少?
分析
??求出一個結點的流量,我們可以對這個結點用一遍樹型dp,對于結點 uuu 和 其兒子 vvv, 若 vvv 是葉子結點,那么 dp[u]+=w(u,v)dp[u] += w(u, v)dp[u]+=w(u,v), 否則 dp[u]+=min(dp[v],w(u,v))dp[u] += min(dp[v], w(u, v))dp[u]+=min(dp[v],w(u,v))。對一個結點我們可以用 O(n)O(n)O(n) 時間算出其流量,但是若是用此法算出所有的結點,是O(n2)O(n^2)O(n2) 的復雜度,會超時。
 ??這時候就要考慮換根的思想:先算出固定某一點為根的答案然后考慮把它的兒子換成根會發生什么樣的變化,如果這個變化是比較好算的,那么我們就可考慮每個點x為根的答案都根據以它父親為根的結果去推。
 ??若我們算出父親的流量 f[u]f[u]f[u], 對于 兒子的流量 f[v]f[v]f[v], 若 vvv 是葉子結點,那么 f[u]f[u]f[u] 中肯定有 w(u,v)w(u, v)w(u,v) 流向 vvv,f[u]?w(u,v)f[u] - w(u, v)f[u]?w(u,v) 流向其他,那么從 vvv 就最多可以流出去 min(f[u]?w,w)min(f[u] - w, w)min(f[u]?w,w); 若 vvv 不是, 那么 f[u]f[u]f[u] 有 min(w,dp[v])min(w, dp[v])min(w,dp[v]) 流向 vvv, f[u]?min(w,dp[v])f[u] - min(w, dp[v])f[u]?min(w,dp[v]) 流向其他,那么從 vvv 就最多可以流出去 dp[to]+min(w,f[u]?min(w,dp[v]))dp[to] + min(w, f[u] - min(w, dp[v]))dp[to]+min(w,f[u]?min(w,dp[v]))。
 ??那么我們需要兩遍 dfs, 第一遍算出一個結點的流量,第二遍進行換根。
總結
以上是生活随笔為你收集整理的[换根] Accumulation Degree的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Gradient Accumulatio
- 下一篇: 【POJ3585】Accumulatio
