如何将无向图变为点/边双连通,如何将有向图变为强连通图

 将无向图变为点-双连通的图

  定义:点-双连通指的是任意两个之间存在至少两条点不重复的路径

  分为两种情况, 一种是连通图,一种是非连通图

  ①连通图

    首先,找出图中的所有点-双连通分量,然后将该分支缩成一个点, 因为双连通分量内部肯定不用考虑的。

    只需要考虑双连通分量与外部的其它结点,如何加边才能形成点-双连通分量。

    

    上图的结点2,3,4,5构成了一个点-双连通分支,我们进行缩点,得到下面的图

    

  可以知道,缩点之后的图是一棵树(因为环都被缩成一个点了嘛)

  那么问题就转化为了,如果将一棵树变为点-双连通的图。

  树这种特殊的结构,只要在叶子结点之间加边,那么就可以使得任意两点存在两条点不重复的路径了。

  如果只有一个叶子结点,那么只要连一条边到根结点

  如果有两个叶子结点,那么只要两个叶子结点之间连一条边即可。

  如果有三个叶子结点a,b,c, 那么只要在a,b之间连一条边,b,c之间连一条边即可

  所以叶子结点有cnt_leaf, 那么只要加(cnt_leaf+1)/2条边

  ②非连通图

  对于非连通图,每个连通分量要变成点-双连通分量,那么方法和上面一样。

  那么只有一个问题,如果使两个点-双连通分量变成一个。

  同样的,将点-双连通分量看成一个点, 那么两个点要变成点-双连通,那么只要加2条边就行了

  

  将无向图变为边-双连通的图

   定义:任意两点存在至少两条边不重复的路径。

   同样分为两种情况, 一种是连通图,一种是非连通图   

  ①连通图

    同上

  ②非连通图

    同上

  将有向图变为强连通图

   定义:任意两点都可以相互到达的有向图叫做强连通图

  

   ①连通图

    同样的,找出所有的强连通分量, 然后缩成一个点,然后统计缩点之后的新图的出度为0的点的个数(记为cntOut),和入度为0的点的个数(记为cntIn)

    那么要加边的条数就是max(cntOut,cntIn)

    这个为什么呢?? 因为,如果一个点的入度为0,那么说明这个点是不可达的,如果一个点的出度为0,那么说明这个点到其它点是不可达的。

    为了解决这个情况,那么只要在出度为0的点(设为u)和入度为0的点之间连一条u-->v的边,那么就解决了这种情况。

    不断的连边,只要一个点问题没解决就要连边, 所以是在两者之间取max

   ②非连通图

    对于每个连通的分支之间,按照上面的方法变成强连通分量。

    至于两个连通分量之间,连一条你指向我的边,再连一条我指向你的边就行了。

时间: 2024-11-11 08:08:38

如何将无向图变为点/边双连通,如何将有向图变为强连通图的相关文章

poj3352--E - Road Construction(无向图加边成双连通)

E - Road Construction Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description It's almost summer time, and that means that it's almost summer construction time! This year, the good people who are in char

ZOJ 2588 Burning Bridges 求无向图桥 边双连通裸题

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1588 binshen的板子: #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #i

HDU 4005 The war(双连通好题)

HDU 4005 The war 题目链接 题意:给一个连通的无向图,每条边有一个炸掉的代价,现在要建一条边(你不不知道的),然后你要求一个你需要的最少代价,保证不管他建在哪,你都能炸掉使得图不连通 思路:炸肯定要炸桥,所以先双连通缩点,得到一棵树,树边是要炸的,那么找一个最小值的边,从该边的两点出发,走的路径中,把两条包含最小值的路径,的两点连边,形成一个环,这个环就保证了最低代价在里面,除了这个环以外的最小边,就是答案,这样的话,就利用一个dfs,搜到每个子树的时候进行一个维护即可 代码:

双连通问题

一些定义: 割点集合(割集):在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合. 点连通度:最小割点集合中的顶点数. 割边集合:如果有一个边集合,删除这个边集合以后,原图变成多个连通块,就称这个点集为割边集合. 边连通度:最小割边集合中的边数. 点双连通:如果一个无向连通图的点连通度大于1,则称该图是点双连通的,简称双连通或重连通.割点:一个图有割点,当且仅当这个图的点连通度为1,则割点集合的唯一元素被称为

poj1515--Street Directions(边的双连通)

给一个无向图,要求变成强连通的有向图,需要保留哪些边. 边的双连通,对于桥保留两条边,其他的只保留一条边.求双连通的过程中记录保留边. /********************************************* Problem: 1515 User: G_lory Memory: 232K Time: 32MS Language: C++ Result: Accepted **********************************************/ #incl

【图论】双连通总结

双连通总结 这类问题分为,边-双连通,点-双连通 边双连通 边双连通,求出来后,连接没一个双连通的分量的就是割边,因此可以缩点成一棵树,把问题转化为在树上搞,割边的定义为:去掉这条边后图将不连通 基本这类题都一个解法,求双连通分量,然后缩点成树,进行操作 或者就是直接要求割边,做跟割边相关的操作 模板: #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #

POJ3352Road Construction(边的双连通+强连通缩点)

Road Construction Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8673   Accepted: 4330 Description It's almost summer time, and that means that it's almost summer construction time! This year, the good people who are in charge of the ro

双连通

poj 3352 Road Construction && poj 3177 Redundant Paths 给一个无向图,问最少需要添加多少条边,使它成为双连通图. 做法:边双连通缩点,成为一棵树.若要使得任意一棵树,变成一个双连通图,那么至少增加的边数 =(度数为1的结点数 + 1 )/ 2 1 #include<iostream> 2 #include<cstring> 3 #include<string> 4 #include<cstdio

HDU 2460 Network(双连通+树链剖分+线段树)

HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链剖分+线段树处理 代码: #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; #pragma comment(linke