图的连通性问题之连通和最小环

判断图中两点是否连通

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的最短路径。
综上所述,该算法一定能找到图中的最小环。

你可能感兴趣的:(图论)