题意:求出割点以及除去割点后的连通分量的数量(附带求出了点双连通分量(块))
[求割点]对图深度优先搜索,定义DFS(u)为u在搜索树(以下简称为树)中被遍历到的次序号。定义Low(u)为u或u的子树中能通过非父子边追溯到的最早的节点,即DFS序号最小的节点。根据定义,则有:Low(u)=Min {DFS(u),DFS(v)|(u,v)为后向边(等价于DFS(v)<DFS(u)且v不为u的父亲节点),Low(v)|(u,v)为树枝边}
[条件]一个顶点u是割点,当且仅当满足(1) u为树根,且u有多于一个子树。或(2) u不为树根,且满足存在(u,v)为树枝边(即u为v在搜索树中的父亲),使得DFS(u)<=Low(v)。
[除去点后的连通分量的]:对于(1)的割点,数量为子树的数量;(2)的数量就是满足条件的v的个数+1(它的父亲节点).
[求点双连通分支]对于点双连通分支,实际上在求割点的过程中就能顺便把每个点双连通分支求出。建立一个栈,存储当前双连通分支,在搜索图时,每找到一条树枝边或后向边,就把这条边加入栈中。如果遇到某时满足DFS(u)<=Low(v),说明u是一个割点,同时把边从栈顶一个个取出,直到遇到了边(u,v),取出的这些边与其关联的点,组成一个点双连通分支。割点可以属于多个点双连通分支,其余点和每条边只属于且属于一个点双连通分支。
#include
#include
#include
#include
#include
#include
#include
#include
#include