题目链接
题目类型:LCA
题目分析
题目大意
给出一个无向无权图,共n个顶点m条边,前n-1行可以形成一棵生成树,问在图中,仅包含生成树的一条边的最小割的值为多少
解析
学了LCA之后其实就没怎么再用过LCA,一开始一看最小割,拼命的想要怎样去建图跑网络流,后来发现建不出来Orz
对于一个图来讲,我们一开始有它的一个生成树,因为是生成树,所以图中每一个点都在树上,我们只要把剩下的m - n + 1条边想象成建完树之后加入的即可。如果最简单的考虑,只有一颗生成树,没有别的边,那答案必然为1,这很简单。
如果我们加了一条图中的边呢?假如我们假如的边为下图中的H-M,如果我们割H和M的LCA所形成的子树之外的边的话,也就是除了以C为根节点的树,H-M连线对他们是没有影响的,如果我们想割C-G这条边以分裂以G为顶点的子树的话,我们就必须割开M-H边。所以我们可以对图中的每一条不在树上的边u-v这样处理,cnt[u]++, cnt[v]++表示切当前点,或者以当前点为子树的点贡献的割的边数,如果要割的边在u和v所在的公共子树(即以两者LCA为根节点的子树)以外的地方的话,我们就把对应的LCA减去cnt2[lca]+=2;,因为u,v的两点贡献度都是树自身内部的,对于割当前边没有影响。
当处理剩下m-n+1条边的时候得到了cnt[]和cnt2[],再自顶向下DFS一遍求出删每一条边所对应的割数即可

代码
1 |
|