最短路径 flyod模板

题目描述

n个城市间有m条单向公路,求任意两城市间最短路径
题目来源【坐在马桶上看算法】算法6:只有五行的Floyd最短路算法

题目思路

  • Flyod用于求多源最短路径问题(不能有负权边)
  • 若两城市为编号1和n,求最短路径看1直接到n距离,1由1中转到n,1由2中转到n…其实也是个动态规划问题,两点间距离看看通过中转是否可以比目前的距离更短,不断去更新

代码模板

#include <iostream>
#include<stdio.h>
using namespace std;
#define inf 0x3f3f3f3f
#define max 10
int dis[max][max];
int main() {
    //freopen("in.txt","r",stdin);
    int n,m;
    cin>>n>>m;
    //初始化距离矩阵
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==j) dis[i][j]=0;
                else dis[i][j]=inf;
        }
    }
    //输入
    int a,b,w;
    for(int i=1;i<=m;i++){
        cin>>a>>b>>w;
        dis[a][b]=w;
    }
    //flyod核心五行代码
    for(int k=1;k<=n;k++){//代表中转顶点从1到n
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(dis[i][j]>dis[i][k]+dis[k][j]){
                    dis[i][j]=dis[i][k]+dis[k][j];
                }
            }
        }
    }
    //输出最短路径矩阵
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cout<<dis[i][j]<<" ";
        }
        cout<<endl;
    }
    //fclose(stdin);
    return 0;
}
  • 输入
    4 8
    1 2 2
    1 3 6
    1 4 4
    2 3 3
    3 1 7
    3 4 1
    4 1 5
    4 3 12
  • 输出
    0 2 5 4
    9 0 3 4
    6 8 0 1
    5 7 10 0

猜你喜欢

转载自blog.csdn.net/armstrong_rose/article/details/80336933