关闭

Floyd最短路径算法

255人阅读 评论(0) 收藏 举报
分类:

Floyd-Warshall算法,简称Floyd算法,用于求解任意两点间的最短距离,时间复杂度为O(n^3)。我们平时所见的Floyd算法的一般形式如下:

 void Floyd(){
     int i,j,k;
     for(k=1;k<=n;k++)
         for(i=1;i<=n;i++)
             for(j=1;j<=n;j++)
                 if(dist[i][k]+dist[k][j]<dist[i][j])
                     dist[i][j]=dist[i][k]+dist[k][j];
 }

注意下第6行这个地方,如果dist[i][k]或者dist[k][j]不存在,程序中用一个很大的数代替。最好写成if(dist[i][k]!=INF && dist[k][j]!=INF && dist[i][k]+dist[k][j]

#include <iostream>
  using namespace std;

  const int INF = 100000;
  int n=10,map[11][11],dist[11][11][11];
  void init(){
      int i,j;
      for(i=1;i<=n;i++)
          for(j=1;j<=n;j++)
             map[i][j]=(i==j)?0:INF;
     map[1][2]=2,map[1][4]=20,map[2][5]=1;
     map[3][1]=3,map[4][3]=8,map[4][6]=6;
     map[4][7]=4,map[5][3]=7,map[5][8]=3;
     map[6][3]=1,map[7][8]=1,map[8][6]=2;
     map[8][10]=2,map[9][7]=2,map[10][9]=1;
 }
 void floyd_dp(){
     int i,j,k;
     for(i=1;i<=n;i++)
         for(j=1;j<=n;j++)
             dist[i][j][0]=map[i][j];
     for(k=1;k<=n;k++)
         for(i=1;i<=n;i++)
             for(j=1;j<=n;j++){
                 dist[i][j][k]=dist[i][j][k-1];
                 if(dist[i][k][k-1]+dist[k][j][k-1]<dist[i][j][k])
                     dist[i][j][k]=dist[i][k][k-1]+dist[k][j][k-1];
             }
 }
 int main(){
     int k,u,v;
     init();
     floyd_dp();
     while(cin>>u>>v,u||v){
         for(k=0;k<=n;k++){
             if(dist[u][v][k]==INF) cout<<"+∞"<<endl;
             else cout<<dist[u][v][k]<<endl;
         }
     }
     return 0;
 }

输入 1 3
输出 +∞
+∞
+∞
+∞
28
10
10
10
9
9
9
Floyd-Warshall算法不仅能求出任意2点间的最短路径,还可以保存最短路径上经过的节点。下面用精简版的Floyd算法实现这一过程,程序中的图依然对应上面的有向图。

 #include <iostream>
  using namespace std;

  const int INF = 100000;
  int n=10,path[11][11],dist[11][11],map[11][11];
  void init(){
      int i,j;
      for(i=1;i<=n;i++)
          for(j=1;j<=n;j++)
             map[i][j]=(i==j)?0:INF;
     map[1][2]=2,map[1][4]=20,map[2][5]=1;
     map[3][1]=3,map[4][3]=8,map[4][6]=6;
     map[4][7]=4,map[5][3]=7,map[5][8]=3;
     map[6][3]=1,map[7][8]=1,map[8][6]=2;
     map[8][10]=2,map[9][7]=2,map[10][9]=1;
 }
 void floyd(){
     int i,j,k;
     for(i=1;i<=n;i++)
         for(j=1;j<=n;j++)
             dist[i][j]=map[i][j],path[i][j]=0;
     for(k=1;k<=n;k++)
         for(i=1;i<=n;i++)
             for(j=1;j<=n;j++)
                 if(dist[i][k]+dist[k][j]<dist[i][j])
                     dist[i][j]=dist[i][k]+dist[k][j],path[i][j]=k;
 }
 void output(int i,int j){
    if(i==j) return;
     if(path[i][j]==0) cout<<j<<' ';
     else{
         output(i,path[i][j]);
         output(path[i][j],j);
     }
 }
 int main(){
     int u,v;
     init();
     floyd();
     while(cin>>u>>v,u||v){
         if(dist[u][v]==INF) cout<<"No path"<<endl;
         else{
             cout<<u<<' ';
             output(u,v);
             cout<<endl;
        }
     }
     return 0;
 }

输入 1 3
输出 1 2 5 8 6 3

在程序的调试过程中发现path[i][j]里存放的值是i节点到j节点的最短路径中节点编号最大的值 ,而不是j节点的前驱节点,因为floyd算法中k在最外层循环,k的值从小到大 ,不断尝试经过k节点是否比原来i到j的距离要小。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

floyd算法求解最短路径

转自  http://blog.csdn.net/zhongkeli/article/details/8832946 这个算法主要要弄懂三个循环的顺序关系。 弗洛伊德(...
  • Bocai_Fire
  • Bocai_Fire
  • 2015-05-05 07:54
  • 8419

Floyd_任意点之间的最短路径算法

一、算法介绍:  Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APSP)的算法。从表面上粗看,Floyd算...
  • u013148406
  • u013148406
  • 2016-09-24 14:34
  • 1514

最短路径问题---Floyd算法详解

前言 Genius only means hard-working all one’s life. Name:Willam Time:2017/3/81、最短路径问题介绍问题解释: 从图中的...
  • qq_35644234
  • qq_35644234
  • 2017-03-11 17:01
  • 21850

Floyd最短路径算法

  • 2015-09-24 14:02
  • 160KB
  • 下载

Floyd最短路径算法C++实现

  • 2009-10-11 16:15
  • 9KB
  • 下载

Floyd最短路径算法的动态优化

  • 2012-05-03 19:58
  • 381KB
  • 下载

图的最短路径算法(Dijkstra,Floyd)的实现

从某个源点到其余各顶点的最短路径迪杰特斯拉算法Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点...
  • luoluozlb
  • luoluozlb
  • 2016-08-14 11:44
  • 2445

floyd最短路径算法C#版

本文主要根据floyd算法生成最短路径(包含最短路径值和最短路径经过的所有节点) 首先在数据库中存储创建点表,点的字段包括ID,经度,纬度;线表,线的字段包括IDE(即点的唯一标示值),线的两个端点...
  • zhengxiayuhexue
  • zhengxiayuhexue
  • 2015-12-28 19:37
  • 985

Floyd_任意点之间的最短路径算法

一、算法介绍:  Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APSP)的算法。从表面上粗看,Floyd算...
  • u013148406
  • u013148406
  • 2016-09-24 14:34
  • 1514

Floyd 多源最短路径算法

为求出一个无向图每一个点之间的最短距离,就可以使用到Floyd算法。首先,把每一条最短路径表示为 dis[i,j] ,接着就需要求出每一个点到其他点的算法。例如这样的一个图要求出每一个节点之间的距离,...
  • baidu_35009437
  • baidu_35009437
  • 2016-05-18 12:58
  • 674
    个人资料
    • 访问:100225次
    • 积分:4744
    • 等级:
    • 排名:第7078名
    • 原创:374篇
    • 转载:7篇
    • 译文:0篇
    • 评论:6条
    最新评论