zoukankan      html  css  js  c++  java
  • 图的连通性问题之连通和最小环

    判断图中两点是否连通

    1、floyed算法
    时间复杂度:O(N3)
    算法实现:把相连的两点设为dis[i][j]true,不相连的两点设为dis[i][j]=flase,用Floyed算法的变形:

    for(int k=1;k<=n;k++)
      for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        dis[i][j]=dis[i][j]||(dis[i][k]&&dis[k][j]);

    最后如果dis[i][j]=true的话,表示两点连通。
    有向图和无向图都适用。
    2、遍历算法
    算法实现:从指定一个点出发,进行一次遍历,能够从这个点出发到达的点就与起点连通的。这样就可以求出这个顶点和其他顶点的连通情况。所以只要把每个顶点作为出发点都进行一次遍历,就能知道任意两个顶点之间是否有路存在。
    可以使用DFS实现。
    有向图和无向图都适用。

    最小环问题

    最小环就是指在一张图中找出一个环,使得这个环上的各条边的权值之和最小。在Floyed的同时,可以顺便算出最小环。
    记两点间的最短路为dis[i][j],g[i][j]为边< i,j > 的权值。

    for(int k=1;k<=n;k++)
    {
        for(int i=1;<=k-1;i++)
          for(int j=i+1;j<=k-1;j++)
          answer=min(answer,dis[i][j]+g[j][k]+g[k][i]);
        for(int i=1;i<=n;i++)
          for(int j=1;j<=n;j++)
          dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
    }

    answer即为这张图的最小环。
    一个环中最大的节点为k,与它相连的节点为i,j,这个环的最短长度为g[i][k]+g[k][j]+(i到j的路径中,所有节点编号都小于k的最短路径长度)。
    根据floyed原理,在最外层进行k-1次循环之后dis[i][j]则代表了i到j的路径中,所有结点编号都小于k的最短路径。
    综上所述,该算法一定能找到图中的最小环。

  • 相关阅读:
    行转列
    multipath 安装配置
    网卡绑定
    numa对MySQL多实例性能影响
    Fatal NI connect error 12170
    REVOKE DBA权限要小心
    Oracle 数据库整理表碎片
    listagg 函数
    10046 事件补充
    tkprof 解释
  • 原文地址:https://www.cnblogs.com/cax1165/p/6071019.html
Copyright © 2011-2022 走看看