弗洛伊德算法

题目:

在这里插入图片描述
输入:
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

弗洛伊德核心公式:

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

思路:

弗洛伊德算法用来求任意两点之间的最短距离,也就是多元路径问题,当解决这种问题时我们必须要引入第三个,甚至第四个、第五个…才能达到缩短距离的目的。比如求a->b的最短距离,我们需要引入其他顶点,即a->i->b得距离最短。那么这个或者这几个点是哪个呢?所有点都是有可能的,所以我们需要依次尝试。

#include<iostream>
#include<sstream>
using namespace std;
int main(){
 int map[10][10],n,m,x,y,t;
 int inf=999999999;//定义无穷,表示两点之间不可达
 cin>>n>>m;//n表示顶点数,m表示边的条数
 for(int i=1;i<=n;i++){   //初始化地图
  for(int j=1;j<=n;j++){
   if(i==j) map[i][j]=0;
   else map[i][j]=inf;
  }
 }
 for(int i=1;i<=m;i++){  //输入地图
  cin>>x>>y>>t;
  map[x][y]=t;
 }
 for(int k=1;k<=n;k++){  //弗洛伊德核心算法
  for(int i=1;i<=n;i++){
   for(int j=1;j<=n;j++){
    if(map[i][j]>map[i][k]+map[k][j])
    map[i][j]=map[i][k]+map[k][j];
   }
  }
 }
 for(int i=1;i<=n;i++){   //打印最短路径地图
  for(int j=1;j<=n;j++){
   cout<<map[i][j]<<" ";
  }
  cout<<endl;
 }
  
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值