连通图_连通分量FloodFill

原创 2016年06月01日 19:12:43

首先,我们来介绍一个概念:子图(subgraph)。若一个图的顶点集和边集分别是另一图的顶点集的子集和边集的子集,则称该图为另一图的子图。

换句话说,从一个图里选出一部分顶点和边,只要确保选择的边对应的两个顶点也都被选择,那么所有选出的顶点和边组成的图就是原图的子图。

就像在一个社交网络中,同班同学的帐号之间的关系就组成了整个社交网络的一个子图。

接下来,我们介绍一个概念:连通。在无向图中,如果有从顶点 vv 到顶点 ww 的路径存在,则称 vv 和 ww 是连通的。若图 GG 中任意两个顶点都是连通的,则称图 GG 为连通图,否则成为非连通图。

若图 G 的子图Gs是连通的,我们就称子图 G​s是图 G 的连通子图。如果对于图 G 的一个连通子图G​s,不存在图 G 的其他连通子图 G​max满足:Gs是 Gmax的子图。则子图 G​s 是图 G的极大连通子图,也就是图 G 的连通分量。

如何求解无向图的连通分量呢?这要用到我们本章介绍的第一个图论算法:FloodFill 算法。

FloodFill 算法通常译作“洪水灌溉法”,算法通过给图中的顶点染色,最终使得同一个连通分量的顶点颜色相同,不同连通分量的顶点颜色不同。算法的描述如下:

  1. 找到一个没有染色的顶点,将其染为新的颜色 Color_{new}Color
    ​new
    ​​ ,如果没有则算法结束。

  2. 初始化一个空的队列,并将第一步的顶点插入队列。

  3. 不断获得队首元素的值并弹出,将和队首元素相邻的未染色顶点染为 Color_{new}Color
    ​new
    ​​ ,并将其加入队列。

  4. 重复执行第一步,直到所有顶点都被染色,算法结束。

FloodFill 的时间复杂度是 O(V+E)O(V+E),其中广度优先遍历的部分可以替换成深度优先遍历,复杂度是一样的。通常考虑到递归调用的时间开销,往往广度优先遍历的效率要更高一些。

#include <iostream>
#include <vector>
#include <cstring>
#include <queue>

using namespace std;

class Graph {
private:
    int n;
    int * color;
    vector<int> * edges;


public:
    Graph(int input_n) {
        n = input_n;
        edges = new vector<int>[n];
        color = new int[n];
        memset(color, 0, n * sizeof(int));
    }

    ~Graph() {
        delete[] edges;
        delete[] color;
    }

    void insert(int x, int y) {
        edges[x].push_back(y);
        edges[y].push_back(x);
    }

    void floodfill() {
         int color_cnt=0;
        for(int i=0;i<n;++i){
            if(color[i]==0){
                //不同联通分量内的结点标记不同颜色
                color_cnt++;
                color[i]=color_cnt;
                queue<int> q;
                //未标记结点入队
                q.push(i);
                while(!q.empty()){
                    int vertex= q.front();
                    //依次标记与之有边的结点,并将标记后的节点入队
                    for(int j:edges[vertex]){
                        if(color[j]==0){
                            color[j]=color_cnt;
                            q.push(j);
                        }
                    }
                    q.pop();
                }
            }
        }
        for(int i=0;i<n;++i){
            cout<<i<<" "<<color[i]<<endl;   
        }
    }
};

int main() {
    int n, m, k;
    cin >> n >> m;
    Graph g(n);
    for (int i = 0; i < m; ++i) {
        int x, y;
        cin >> x >> y;
        g.insert(x, y);
    }
    g.floodfill();

    return 0;
}
版权声明:ShirleyPaul原创,未经博主允许不得转载

连通图和连通分量

连通图和连通分量   1.顶点间的连通性      在无向图G中,若从顶点vi到顶点vj有路径(当然从vj到vi也一定有路径),则称vi和vj是连通的。 2.连通图      若V(G)中任意两个...
  • qq_33913037
  • qq_33913037
  • 2017年05月05日 16:14
  • 4955

数据结构——图 连通图与连通分量

note: 连通是无向图中的概念 接下来介绍两个算法:判断图的连通性与标记连通分量。 1. 判断一个图是否连通. Determine whether an undirected graph i...
  • ZDF19
  • ZDF19
  • 2016年12月16日 17:13
  • 2126

数据结构之图-连通分量

连通分量的定义: 在无向图中,如果从顶点vi到顶点vj有路径,则称vi和vj连通。如果图中任意两个顶点之间都连通,则称该图为连通图,否则,称该图为非连通图,则其中的极大连通子图称为连通分量,这里所谓...
  • madman188
  • madman188
  • 2014年04月23日 15:44
  • 2741

数据结构之无向图的连通分量和生成树

数据结构之无向图的连通分量和生成树
  • doubleselect
  • doubleselect
  • 2014年10月16日 19:29
  • 2947

【数据结构】算法7.7-7.8 无向图的连通分量和生成树

#include #include #include#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEAS...
  • Vit_rose
  • Vit_rose
  • 2016年10月10日 21:13
  • 551

二次遍历法高速提取连通图,OpenCV接口版本

一次性输出最大连通图,速度,之前写过一个算法
  • pc1377318286
  • pc1377318286
  • 2014年11月23日 19:33
  • 1430

十二、图的算法入门--(1)连通分量和FloodFill算法

摘自计蒜客:http://www.jisuanke.com/course/35/7547 一、连通分量和FloodFill算法 首先,我们来介绍一个概念:子图(subgraph)。若一个图的顶点集和边...
  • firetreeSF
  • firetreeSF
  • 2016年05月08日 11:05
  • 676

求无向图的连通分量 算法

耗时两天,终于把怎样求无向图的连通分量看懂了。算法是以前老师告诉我的吧,现在忘了,所以才看明白 一个无向图放在一个矩阵里面,比如一个3*3的list [0]  list [1]list [2]循环遍历...
  • linxinyuluo
  • linxinyuluo
  • 2011年07月16日 00:58
  • 8341

无向图的连通分量(BCC)模版

点双连通:如果任意两点之间至少存在两条”点不重复”的路径,则说这个图是点双连通的,这个要求等价于任意两条边都在同一个简单环中,即内部无割点边双连通:如果任意两点至少存在两条“边不重复“的路径,我们说这...
  • L123012013048
  • L123012013048
  • 2015年09月08日 15:42
  • 757

通过BFS 和 DFS两种方法找无向图的连通分量

class Solution { public: /** * @param nodes a array of Undirected graph node * @return...
  • AddisionYoung
  • AddisionYoung
  • 2015年12月20日 14:10
  • 341
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:连通图_连通分量FloodFill
举报原因:
原因补充:

(最多只允许输入30个字)