floyd算法分析

floyd算法

    • floyd 算法原理简介floyd算法用到了一种动态规划的思想,及将一个复杂的问题分化为一个更小的子问题
    • 源程序

floyd 算法原理简介floyd算法用到了一种动态规划的思想,及将一个复杂的问题分化为一个更小的子问题

  1. 求u->v 之间的最短路径,这个问题就是我们要处理的大问题,如果整个节点的数据集为N,我们知道两点的最短路径最多可经过n-2个点。最简单的方法我们可以利用深搜求出所有可能路径并计算最短路径,我们知道深搜复杂度为O(m),m为边数,那么我们求所有的uv之间的最短路径那么复杂度就是n^2*O(m)。
  2. 我分析上述问题如果假设u->v之间不允许经过其他的点,那么结果我们是不是已知的,就是给定的图G本身。
  3. 下面进行问题的分解,比如我任选一点k。所有的路径都不能经过k点,即我已知左右经过除k之外的所有点的最短路径。那么对于u<->v之间的最短路径就是uk+kv的长度和原先不经过k的点的最短路径。那么问题得到了分解,求uk之间的最短路,之间是没有点k存在的,为什么,如果点k存在说明uk+kv这条路有环,有环如果还能减小路径长度的话,只能是有负环,这样是不存在最短路径的,顺便说一下,floyd是可以判断负权回路的。
  4. 现在我们来说一下算法,我们假设Ak是经过{1,2,。。。,k}这么多点的最短路径,那么Ak+1可以有Ak得到,A0即为我们初始的邻接矩阵图G。

源程序

#include
using namespace std;
const int Max = 10000;
const int v = 100;
int graph[v][v];
void init(int n){
 for(int i=1; i<=n; i++){
  for(int j=1; j<=n; j++){
   if(i!=j)
    graph[i][j] = Max;
   else
    graph[i][j] = 0;
  }
 }
}
void read_graph(int m){
 for(int i=0; i<m; i++){
  int from, to, w;
  scanf("%d%d%d",&from,&to,&w);
  graph[from][to] = w;
 } 
}
int main(){
 int n, m;
 scanf("%d%d",&n,&m);
 init(n);
 read_graph(m);
 for(int k=1; k<=n; k++){
  for(int i=1; i<=n; i++){
   for(int j=1; j<=n; j++){
    if(graph[i][k] + graph[k][j] < graph[i][j])
     graph[i][j] = graph[i][k] + graph[k][j];
   }
  }
 }
 for(int i=1; i<=n; i++){
  for(int j=1; j<=n; j++){
   printf("%d ",graph[i][j]);
  }
  printf("\n");
 }
 return 0;

}

你可能感兴趣的:(数据结构与算法分析)