只有五行的算法Floyd-Warshall.

求城市到城市最短距离,多源最短路径问题.用矩阵(二维数组)来存储城市间的路径信息比如i城市到j城市的距离为a[j][i].
输入格式:第一行输入N,表示共有N个城市.随后N行输入,每一行代表该行到列城市的距离,规定自己到自己为0,99999表示没有路通向另一个城市.
输出一个更新成最小距离的矩阵,同输入时的矩阵.
思路,从a到b的距离要缩短必然要经过第三个点既a-c-b,距离才可能缩短,有时候中转不止一个城市.比如现在有五个城市求城市直接的距离,现在只允许从1城市中转.则

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

现在数组中的距离已经更新为允许从一中转的最短距离,重复这样的过程直到允许从所有地方中转,而这个距离在做动态的更新.可以理解为我要从一到四虽然我只从五中转到四,但这个五到四的距离是通过五的最优中转得来的距离,不管他中转的过程只看结果所以如下

代码实现

#include<stdio.h>
int main()
{
	int a[51][51],N;//a存地图,N表示城市数量
	scanf("%d",&N);
	for(int i=0;i<N;i++){
		for(int j=0;j<N;j++){
			scanf("%d",&a[i][j]);
		}
	}
	for(int k=0;k<N;k++){
		for(int i=0;i<=0;i++){
			for(int j=0;j<N;j++){
				if(a[i][j]<a[i][k]+a[k][j]){
					a[i][j]=a[i][k]+a[k][j];
				}//算法说起来麻烦,但实现起来仅有这五行,这就是Fioyd-Warshall.
			}
		}
	}
	for(int i=0;i<N;i++){
		for(int j=0;j<N;j++){
			printf("%d",a[i][j]);
		}
		return 0;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值