码迷,mamicode.com
首页 > 其他好文 > 详细

笔记:多源最短路径(FLOYD)

时间:2018-01-22 19:17:51      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:整数   class   初始化   顶点   alt   算法   注意   技术   实现   

技术分享图片

文中代码如下:

 

#include <iostream>
#include <cstdio>
 using namespace std; 
 int e[10][10]; 
  
int main()
{
    int k,i,j,n,m,t1,t2,t3;
    int inf=99999999; //用inf存储一个我们认为的正无穷值
    cin>>n>>m;       //读入n和m,n表示顶点个数,m表示边的条数
   
 //初始化数组,其实就是初始化城市之间的路程
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i==j) e[i][j]=0;//i==j表示同一个城市
              else e[i][j]=inf;//
              
    //读入边(权值)
    for(i=1;i<=m;i++)
    {
        cin>>t1>>t2>>t3; //t1、t2表示城市,t3表示两城市之间的路程
        e[t1][t2]=t3;    //两城市之间最初的值
    }
                              
   //经过第1个点中转 
         for(i=1;i<=n;i++)            
            for(j=1;j<=n;j++)                
                if(e[i][j]>e[i][1]+e[1][j] )                                       
                    e[i][j]=e[i][1]+e[1][j];                    
                    for(i=1;i<=n;i++)     
                    
    //再经过第2个点中转 
         for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(e[i][j]>e[i][2]+e[2][j] )
                    e[i][j]=e[i][2]+e[2][j];
                    
    //再经过第3个点中转 
         for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(e[i][j]>e[i][3]+e[33][j] )
                    e[i][j]=e[i][3]+e[3][j];
                
    //再经过第4个点中转 
         for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(e[i][j]>e[i][4]+e[4][j] )
                    e[i][j]=e[i][4]+e[4][j];
                    
 /*//我们把上面经过1、2、3、4点代码整理一下,便写出了Floyd-Warshall的算法核心语句
   //它的时间复杂度是O(N3)。令人很震撼的是它竟然只有五行代码,实现起来非常容易。
   //如果时间复杂度要求不高,使用Floyd-Warshall来求指定两点之间的最短路或者
   //指定一个点到其余各个顶点的最短路径也是可行的。    
   
    for(k=1;k<=n;k++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(e[i][j]>e[i][k]+e[k][j] )
                    e[i][j]=e[i][k]+e[k][j];  */ 
                    
    /*有一点需要注意的是:如何表示正无穷。我们通常将正无穷定义为99999999,
    因为这样即使两个正无穷相加,其和仍然不超过int类型的范围
    (C语言int类型可以存储的最大正整数是2147483647)。
    在实际应用中最好估计一下最短路径的上限,只需要设置比它大一点既可以。
    例如有100条边,每条边不超过100的话,只需将正无穷设置为10001即可。
    如果你认为正无穷和其它值相加得到一个大于正无穷的数是不被允许的话,
    我们只需在比较的时候加两个判断条件就可以了,请注意下面代码中的语句。
     */ 

/*//Floyd-Warshall算法核心语句
for(k=1;k<=n;k++)
  for(i=1;i<=n;i++)
      for(j=1;j<=n;j++)
        if(e[i][k]<inf && e[k][j]<inf && e[i][j]>e[i][k]+e[k][j])
            e[i][j]=e[i][k]+e[k][j];  */ 
                                   
    //输出最终的结果,是一个矩阵图 
    for(i=1;i<=n;i++)
    {
     for(j=1;j<=n;j++)
        {
            cout<<e[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

 

笔记:多源最短路径(FLOYD)

标签:整数   class   初始化   顶点   alt   算法   注意   技术   实现   

原文地址:https://www.cnblogs.com/wozaixuexi/p/8330180.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!