题目链接
题目大意
给定一张$n$个点$m$条边的联通无向图,问删除每个点后有多少点不连通。
$n\le 10^5$,$m\le 5*10^5$
做法
如果我们能够快速知道每个点被删除后,剩下的每个联通块的大小就可以算出答案了。
具体做法:对每个节点记录一个$now$,一个$ans$,表示这个节点当前联通块大小的和,找到一个新的联通块后$ans+=now*size,now+=size$
那么我们就用$tarjan$求割点,每当一个点作为割点的时候统计答案。
用$size_i$表示$i$号点目前所在联通块的大小。
$now_i,ans_i$表示上述做法中的$now,ans$
在$tarjan$求割点的时候,如果发现$low[v]>=dfn[u]$,说明$v$所在的联通块在割掉$u$这个点之后是一个独立的联通块,那么$ans[u]+=now[u]*size[v],now[u]+=size[v]$。
但是别忘了最后还要加上最后一个联通块,这个联通块是在$tarjan$我之前遍历的那个联通块。
所以$ans[u]+=now[u]*(n-now[u]-1)$
还有就是我这个点被删掉了,所以我不能走到其他的任意点$ans[u]+=n-1$
由于点对是无序点对,$ans[u]*=2$
代码
1 |
|