如何判断无向图是否连通


任取两个顶点,我们都能找到一条路径从一点到达另一个点,这个图就是连通的

1.DFS法:

把一个图的所有顶点都进行一次DFS,当然,进行DFS的前提必须是这个点没有被遍历过。所以如果一个图是连通的,那么从一个点开始DFS,所有的点都会被遍历到,这样其他4个顶点就不用再DFS了。按照这个思路,定义一个count为DFS过顶点的个数,如果count=1,则图为连通的,否则就是不连通的。

测试数据:

5 3
0 1
0 2
2 3

示例代码:

bool occupy[N]={false};
void DFS(vector<vector<Node>>&v,int start){
  vector<int>q;
  int i;
  q.push_back(start);
  occupy[start]=true;
  while(!q.empty()){
    int t=q.front();
    q.pop_back();
    occupy[t]=true;
    for(i=0;i<v[t].size();i++){
      if(occupy[v[t][i].num]==false){
        q.push_back(v[t][i].num);
      }
    }
  }
}
void check_connection(vector<vector<Node>>&v){
  int i,counts=0;
  for(i=0;i<points;i++){
    if(occupy[i]==false){
        DFS(v,i);
        counts++;
    }
  }
  cout<<"counts:"<<counts<<endl;
}

2. 交并集

int fathers[N]={0};
int points,edges;
int findfather(int num){
  int f=num;
  while(fathers[f]!=f){
    f=fathers[f];
  }
  int p=f;
  f=num;
  int t;
  while(fathers[f]!=f){
    t=fathers[f];
    fathers[f]=p;
    f=t;
  }
  return f;
}
void merge(int a,int b){
  int a1=findfather(a);
  int b1=findfather(b);
  fathers[a1]=b1;
}
bool check_connection(){
  int i;
  for(i=1;i<points;i++){
    if(findfather(i)!=findfather(i-1)){
      return false;
    }
  }
  return true;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据结构与算法--图论之寻找连通分量、强连通分量 寻找无向图的连通分量 使用深度优先搜索可以很简单地找出一幅图的所...
    sunhaiyu阅读 9,644评论 2 11
  • https://zh.visualgo.net/graphds 浅谈图形结构https://zh.visualgo...
    狼之独步阅读 4,243评论 0 0
  • 图的定义与术语 1、图按照有无方向分为无向图和有向图。无向图由顶点和边构成,有向图由顶点和弧构成。弧有弧尾和弧头之...
    unravelW阅读 435评论 0 0
  • 弥陀昼夜盼儿归, 痴子迷在娑婆里, 愚蠢顽劣不晓得, 贪着五欲大玩具, 为此送命长轮回; 幸得人身闻真理, 真理就...
    与有缘人共进阅读 632评论 0 2
  • 切面和功能垂直,切面横切于各个功能之上
    BlackCodes阅读 267评论 0 0