0
点赞
收藏
分享

微信扫一扫

(含答案)C++笔试题你可以答对多少?

海滨公园 2024-09-27 阅读 16

Floyd算法是求最短路径类题目中编码复杂度最低的算法,可以说是最简单的算法了,哈哈哈

输入样例:

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
#include<iostream>
using namespace std;

int main(){
 	int e[10][10],k,i,j,n,m,t1,t2,t3;
 	//用inf存储一个无穷大的值 
	int inf=999999;
	//读入顶点个数和边的条数 
	cin>>n>>m;
	
	//初始化
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
			if(i==j){
				e[i][j]=0;
			}else{
				//若两个点之间无法直接到达,则定义为无穷大 
				e[i][j]=inf;
			}
		}
	} 
	//读入边
	for(i=1;i<=m;i++){
		//t1,t2分别表示两个点,t3表示他们之间的距离 
		cin>>t1>>t2>>t3;
		e[t1][t2]=t3;
	} 
	
	//Floyd算法核心语句
	for(k=1;k<=n;k++){
		for(i=1;i<=n;i++){
			for(j=1;j<=n;j++){
				//从第k号顶点中转,若比原来的值小,则更新他
				//实际上Floyd就是枚举了所有可能中转的方式,计算出任意两点间的最短距离 
				if(e[i][j]>e[i][k]+e[k][j]){
					e[i][j]=e[i][k]+e[k][j];
				}
			}
		}
	} 
	//输出最终结果
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
			cout<<e[i][j]<<" ";
		}
		cout<<"\n";
	} 
	return 0; 
}
 

输出样例

0 2 5 4
9 0 3 4
6 8 0 1
5 7 10 0

尽管Floyd算法实现起来十分容易,但是他的时间复杂度十分高,若要处理数据量比较大的数据,就不太适用了,它还无法解决“负权回路”的问题,因为“负权回路”没有最短路径,它每走一次,最短路径减1

举报

相关推荐

0 条评论