最短路径三大算法——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一道例题

dbb94e4c81454a3fb7de25012eae446e.png

AC代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <bits/stdc++.h>
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;
}

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值