题目链接
题目类型: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 |
|