- 对于无向图G(方便起见只考虑联通图),如果删除某个点u后,连通分量数目增加,称u为图的关节点或割顶,对于连通图,割顶就是删除之后使图不再联通的点。对于连通图,删除一条边(u,v)后使图不在联通,则称(u,v)是桥。
- 定理: 在无向图G的dfs树中,非根结点u是G的割顶当且仅当u存在一个子节点v使得v及其后代都没有连回u祖先(u不算)的边。
- 可以类推出, 在无向图G的dfs树中,(u,v)是桥当且仅当v及其v的的后代除了无向边(u,v)以外不存在连回u及其u祖先的边。
- 实现,与tarjan类似,dfn[i]存i的dfs序,low[i]存i所能到达的dfs序最小的点;则割顶判断定理的条件可以简写成存在low[v]>=dfn[u];桥的判定定理可以写成low[v]>dfn[u];
void dfs(int u,int fa)
{
int num=0;
bool g=0;
sizes[u]=1;
low[u]=dfn[u]=++dindex;
for(int i=last[u];i;i=e[i].next)
{
int v=e[i].v;
if(!dfn[v])
{
num++;
dfs(v,u);
sizes[u]+=sizes[v];
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u])
g=1;
if(low[v]>dfn[u])
bri[i]=1;
} else if(low[v]<low[u]&&v!=fa)
low[u]=low[v];
}
if(fa==-1&&num==1) g=0;
ge[u]=g;
}