本代码现在在Poj上无法AC,请谨慎参考
因为这个换根比较简单,只简述一下要维护的东西:
1,每个节点维护一个weight[]
,表示从叶子到根的方向,这个点最多能接纳的流量。
2,边权。
所以画画图,手动模拟一下就得出了以下转移:
void dfs2(int u,int fa)
{
for (int i = head[u]; i ; i = a[i].next) {
int v = a[i].to;
if (v == fa) continue;
int now = res[u] - a[i].w;
int c = 0;
c += min(a[i].w,now);
for (int j = head[v]; j ; j = a[j].next) {
int vv = a[j].to;
if (vv == u) continue;
c += min(a[j].w,weight[vv]);
}
// cout << v << ' ' << c << endl;
res[v] = c;