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

    xiaoxiao2023-11-16  152

    前言

    如果求出每两点之间的最短路,不必多次调用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; }
    最新回复(0)