zoukankan      html  css  js  c++  java
  • 判断一个图是否连通

    个人总结一下:

    总的来说,可以用DFS(O(v^2))和BFS(O(v+e))的思想都能实现,只要从一个点出发,然后判断是否能遍历完所有的点。还有就是Tarjan算法和GABOW算法,这个没研究过,据说很好用。

    实现办法一:用Floyd算法,时间复杂度为O(v^3),时间复杂度较大。

    实现办法二:拓扑排序(多用于有向图)。

    实现办法三:用BFS和visa[]标志数组,看看从一个点出发,是否能访问完所有的点。

    实现办法四:用DFS,(思想和办法三相差无几,递归用while循环代替而已)核心代码如下:


    用邻接链表表示的图

     1 void dfs(int s)
     2 {
     3       visit[s] = true;
     4       cnt++;
     5       node* p = vnode[s];
     6       for (;p; p = p->next)
     7       {
     8            if (!visit[p->v]) 
     9 
    10                   dfs(p->v);
    11       }
    12       return;
    13  }
    14 
    15 cnt为全局变量,当cnt与总结点数相等时,就连通。
    16 
    17 
    18 
    19 /*用了广度优先搜索的思想*/
    20 bool Connectivity_BFS(MGraph m)
    21 {
    22  queue<int> q;
    23  bool visa[MAX_VERTEX_NUM];//之前先初始化为false
    24  int count=0;
    25  memset(visa,0,sizeof(visa));
    26  q.push(1);
    27  while(!q.empty())
    28  {
    29   int v=q.front();
    30   visa[v]=true;
    31   q.pop();
    32   count++;
    33   for(int i=1;i<=m.vexnum;i++)//把与v连通并且没有被访问过的结点压进队列里面。
    34   {
    35    if(m.arc[v][i].weight)
    36     if(!visa[i])
    37     {
    38      q.push(i);
    39      visa[i]=true;//标志被访问过。
    40     }
    41   }
    42  }
    43  if(count==m.vexnum)//如果压进栈的结点个数刚好等于总结点的个数,则连通。
    44   return true;
    45  return false;
    46 }
  • 相关阅读:
    Java实现三人年龄
    从session中获取当前用户的工具类
    全局Session-GlobalSession
    Request获取Session的两种方式
    跨域访问sessionid不一致问题
    获得HttpServletRequest 和HttpSession对象
    eclipse pom.xml 报错org.apache.maven.plugin.war.WarMojo的解决办法
    idea与eclipse项目相互导入的过程
    静态工具类中使用注解注入service实例
    解决静态utils里面注入mapper对象
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2694832.html
Copyright © 2011-2022 走看看