概念:对于无向图G,如果删除某个节点u后,连通分量的数目增加,则称u为图的关节点或割顶。
定理:在无向连通图G的dfs树中,非根节点u是G的割顶当且仅当u存在一个子节点v,使得v及其所有后代都没有反向边连回u的祖先(u不算)。
证明略;
方便起见,设low【u】为u及其后代所能连回的最早的祖先的pre(编号值)值,则定理中的条件就能够简写为low(v)>=pre(u);
如果后代只能连回自己(即low(v)>pre(u)),只需删除(u,v)就可以让图G非连通了,满足这个条件的称为桥。
int dfs(int u,int fa){
int lowu=pre[u]=++dfs_clock;
int child=0;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(!pre[v]){
child++;
int lowv=dfs(v);
lowu=min(lowv,lowu);
if(lowv>=pre[u]){//¸îµã
is_cut[u]=true;
}
if(lowv>pre[u]){//ÇÅ
is_bridge[u]=true;
}
}
else if(pre[v]<pre[u]&&v!=fa){
lowu=min(lowu,pre[v]);
}
}
if(fa<0&&child==1)is_cut[u]=0;
low[u]=lowu;
return lowu;
}