最短路径三大算法——1,弗洛伊德算法floyd(复杂度O(n^3))

目前已经更新:

1,弗洛伊德算法floyd(复杂度O(n^3))

2,迪杰斯特拉算法dijkstra (复杂度O(最坏n^2))

3,SPFA算法(复杂度O(n*m))

当然,最短路径有通用的bfs,dfs大神,但是我们这里特别介绍floyd,dijkstra还有spfa,本系列分为三篇

目录

Floyd可以精简的概况为起点,中点与终点,很容易联系到arr[i][k]到arr[k][j],i为起点,k为中间点,j为终点,所以显然他时间复杂度自然是高贵的O(n^3)(大数据会被卡TLE)

HDU一道例题

AC代码


 

Floyd可以精简的概况为起点,中点与终点,很容易联系到arr[i][k]到arr[k][j],i为起点,k为中间点,j为终点,所以显然他时间复杂度自然是高贵的O(n^3)(大数据会被卡TLE)

 

HDU一道例题

最短路径三大算法——1,弗洛伊德算法floyd(复杂度O(n^3))_第1张图片

AC代码

#define _CRT_SECURE_NO_WARNINGS 1
#include 
using namespace std;
#define ll long long

const int N = 210;
const int INF = 0x3f3f3f3f;
int arr[N][N];

int main() {
	int n, m;
	while (cin >> n >> m) {
		memset(arr, 0x3f, sizeof(arr));//memset处理4字节,0x3f就等价于0x3f3f3f3f,赋值极大,是保证后面转移一定能够取到那些小的
		int a, b, x;
		for (int i = 1; i <= m; ++i) {
			cin >> a >> b >> x;
			if(arr[a][b]>x)      //注意,俩城市可以不止一条路,所以我要判断,只有新的路程x小于我原来储存的arr[a][b]我才更新
			arr[a][b] = arr[b][a] = x;//不知道a,b谁大谁小,不过无所谓,同化就好
		}
		for (int i = 0; i < n; ++i)arr[i][i] = 0;//自己到自己路程肯定是0
		int s, t;
		cin >> s >> t;
		for (int k = 0; k < n; ++k)//以k为头,因为我们要明确是围绕中间顶点来遍历,而不是起点或者终点,不以中点遍历可能数据不能及时更新,导致WA
			for (int i = 0; i < n; ++i)
				for (int j = 0; j < n; ++j)
					arr[i][j] = min(arr[i][j], arr[i][k] + arr[k][j]);//是不是跟dp差不多
		if (arr[s][t] < INF)cout << arr[s][t] << endl;
		else cout << -1 << endl;
	}

	return 0;
}

 

 

你可能感兴趣的:(ACM入门基础算法知识,图论,算法,蓝桥杯,c++)