全源最短路径问题——Floyd(弗洛伊德)算法应用

相比Dijkstra,弗洛伊德算法在理解上真的太友好了!!
有一点要注意:由于该算法时间复杂度比较大(n的立方),因此只能用来解决n的顶点数为200以内的问题,显然用邻接矩阵更方便

例题:迪杰斯特拉算法应用1——输出所有顶点的最短距离
(在输入上唯一不同是不需要输入起始顶点编号)

代码:

#include <stdio.h>
#include <algorithm>
using namespace std;

const int INF = 100000000;
const int maxn = 200;   //最大顶点数为200
int n,m;
int dis[maxn][maxn];   //二维数组dis[i][j]表示顶点i和顶点j的最短距离 

void Floyed(){
	for(int k = 0;k <n;k++){
		for(int i = 0;i <n;i++){
			for(int j = 0;j <n;j++){
				if(dis[i][k] != INF && dis[k][j] != INF && dis[i][k] + dis[k][j] <dis[i][j]){
					dis[i][j] = dis[i][k] + dis[k][j];
				}
			}
		}
	}
} 

int main(){
	int u,v,w;
	fill(dis[0],dis[0]+maxn*maxn,INF);
	scanf("%d%d",&n,&m);
	for(int i = 0;i <n;i++){
		dis[i][i] = 0;
	}
	for(int i = 0;i <m;i++){
		scanf("%d%d%d",&u,&v,&w);
		dis[u][v] = w;
	}
	Floyed();
	for(int i = 0;i <n;i++){
		for(int j = 0;j <n;j++){
			printf("%d ",dis[i][j]);
		}
		printf("\n");
	}
	return 0;
}

/*
6 8
0 1 1
0 3 4
0 4 4
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3

*/
发布了212 篇原创文章 · 获赞 6 · 访问量 6394

猜你喜欢

转载自blog.csdn.net/weixin_42377217/article/details/104312465