图论 —— 图的连通性 —— 有桥连通图加边变边双连通图

对于一个有桥的连通图,加边变成边双连通图

1.求出所有的桥,然后删除这些桥边。剩下的每个连通块都是一个双连通子图。

2.把每个双连通子图收缩为一个顶点。

3.加回桥边,统计度为1的节点的个数(叶节点的个数),记为 leaf

则:至少在树上加 (leaf+1)/2 条边,就能使树达到边双连通

除使用两次 dfs 外,还可以使用 Tarjan 算法一次求出所有点的 low[i] 值,由于同一个边双连通分量的点他们的 low[i] 值一定相同,因此对于不同边双连通分量的点,他们的 low 值一定不同。

int n,m;
int dfn[N],low[N];
int degree[N];
int block_cnt;
vector G[N];
int Tarjan(int x,int father) {
    int lowx=dfn[x]=++block_cnt;
    for(int i=0; i0)
     *          cnt++;
     *  printf("%d\n",cnt);
     */

    return 0;
}

你可能感兴趣的:(#,图论——图的连通性)