ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Codeup——621 | 问题 B: 算法7-16:弗洛伊德最短路径算法

2021-03-09 11:05:29  阅读:181  来源: 互联网

标签:621 16 int MAXV ++ 算法 顶点 INF


题目描述

在带权有向图G中,求G中的任意一对顶点间的最短路径问题,也是十分常见的一种问题。
解决这个问题的一个方法是执行n次迪杰斯特拉算法,这样就可以求出每一对顶点间的最短路径,执行的时间复杂度为O(n3)。
而另一种算法是由弗洛伊德提出的,时间复杂度同样是O(n3),但算法的形式简单很多。
可以将弗洛伊德算法描述如下:

在本题中,读入一个有向图的带权邻接矩阵(即数组表示),建立有向图并按照以上描述中的算法求出每一对顶点间的最短路径长度。

输入

输入的第一行包含1个正整数n,表示图中共有n个顶点。其中n不超过50。
以后的n行中每行有n个用空格隔开的整数。对于第i行的第j个整数,如果大于0,则表示第i个顶点有指向第j个顶点的有向边,且权值为对应的整数值;如果这个整数为0,则表示没有i指向j的有向边。当i和j相等的时候,保证对应的整数为0。

输出

共有n行,每行有n个整数,表示源点至每一个顶点的最短路径长度。如果不存在从源点至相应顶点的路径,输出-1。对于某个顶点到其本身的最短路径长度,输出0。
请在每个整数后输出一个空格,并请注意行尾输出换行。

样例输入

4
0 3 0 1
0 0 4 0
2 0 0 0
0 0 1 0

样例输出

0 3 2 1 
6 0 4 7 
2 5 0 3 
3 6 1 0 
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXV = 200;
const int INF = 1000000000;
int G[MAXV][MAXV], n;
int d[MAXV][MAXV] = {0};

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

int main()
{
	cin >> n;
	fill(d[0], d[0] + MAXV * MAXV, INF);
	for(int i = 0; i < n; i++)
		for(int j = 0; j < n; j++) {
			scanf("%d", &G[i][j]);
			if(G[i][j] > 0) d[i][j] = G[i][j];
			else if(i == j) d[i][j] = 0;
		}
	Floyd();
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++)
			printf("%s%d", j == 0 ? "" : " ", d[i][j] == INF ? -1 : d[i][j]);
		cout << endl;
	}
	return 0;
}

标签:621,16,int,MAXV,++,算法,顶点,INF
来源: https://blog.csdn.net/qq_44888152/article/details/114577653

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有