最短路径之Floyd算法,简单如一

前言

如果求出每两点之间的最短路,不必多次调用Dijkstra算法,有一个更简单的算法叫Floyd算法。

基本思想

对于从vi到vj的弧,进行n次试探:首先考虑路径vi,v0,vj是否存在,如果存在,则比较vi,vj和vi,v0,vj的路径长度,取较短者为从vi到vj的中间顶点的序号不大于0的最短路径。在路径上再增加一个顶点v1,依此类推,在经过n次比较后,最后求得的必是从顶点vi到顶点vj的最短路径。

tip

调用Floyd算法之前需要做一些简单的初始化,顶点到顶点本身权值为零,其他全部为无穷大。核心代码如下:

for(int k=1; k<=n; k++)
    {
    	for(int i=1; i<=n; i++)
    	{
    		for(int j=1; j<=n; j++) 
    		{	
    	 		if(mp[i][k]+mp[k][j]<mp[i][j])
				{
				 	mp[i][j]=mp[i][k]+mp[k][j];
				}
			}
		}
}

完整代码

#include<bits/stdc++.h>
using namespace std;
 
const int inf=1<<29;
const int N=100;
int main()  
{  
    int mp[N][N],n,m,t1,t2,t3;
    cin>>n>>m;
    for(int i=1; i<=n; i++)//初始化邻接矩阵 
    {
    	for(int j=1; j<=n; j++)
		{
			if(i==j)  
                mp[i][j]=0;
            else  
                mp[i][j]=inf;
		} 
	}
    for(int i=1; i<=m; i++) 
    {  
       	cin>>t1>>t2>>t3;
        mp[t1][t2]=t3;
		mp[t2][t1]=t3;
    }  
    //弗洛伊德(Floyd)核心语句  
    for(int k=1; k<=n; k++)
    {
    	for(int i=1; i<=n; i++)
    	{
    		for(int j=1; j<=n; j++) 
    		{	
    	 		if(mp[i][k]+mp[k][j]<mp[i][j])
				{
				 	mp[i][j]=mp[i][k]+mp[k][j];
				}
			}
		}
	}
    for(int i=1; i<=n; i++)  //输出
    {  
        for(int j=1; j<=n; j++)
		{
			printf("%d\t",mp[i][j]);
		}   
        cout<<endl;
    }  
    return 0;
}
发布了28 篇原创文章 · 获赞 40 · 访问量 3469

猜你喜欢

转载自blog.csdn.net/weixin_43912621/article/details/90551745
今日推荐