首页 > 编程语言 > 详细

机试真题 弗洛伊德算法

时间:2020-04-13 19:26:15      阅读:51      评论:0      收藏:0      [点我收藏+]

裸的弗洛伊德算法,题目中指定,再阐述一下思想;

 

弗洛伊德思想:

对于n个结点,如果该节点当其他任意两个结点i,j的中继,可以缩短i和j之间的距离,则进行更新;

采用三个循环更新,复杂度为O(n^3);

 

#include<iostream>
#include<vector>
#include<string>
using namespace std;

const int maxn = 210;
const int INF = 10000000;
int ma[maxn][maxn];

int n, m;
int st, ed;

void init() {
	fill(ma[0], ma[0] + maxn * maxn, INF);
	for (int i = 0; i < n; i++) {
		ma[i][i] = 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 (ma[i][k] != INF && ma[k][j] != INF && ma[i][k] + ma[k][j] < ma[i][j]) {
					ma[i][j] = ma[i][k] + ma[k][j];
				}
			}
		}
	}
}

int main() {
	while (cin >> n >> m) {
		init();
		int a, b, c;
		for (int i = 0; i < m; i++) {
			cin >> a >> b >> c;
			ma[a][b] = ma[b][a] = c;
		}
		cin >> st >> ed;
		floyd();
		if (ma[st][ed] == INF)
			cout << -1 << endl;
		else
			cout << ma[st][ed] << endl;
	}
}

  

机试真题 弗洛伊德算法

原文:https://www.cnblogs.com/songlinxuan/p/12693025.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!