目前已经更新:
2,迪杰斯特拉算法dijkstra (复杂度O(最坏n^2))
当然,最短路径有通用的bfs,dfs大神,但是我们这里特别介绍floyd,dijkstra还有spfa,本系列分为三篇
目录
Floyd可以精简的概况为起点,中点与终点,很容易联系到arr[i][k]到arr[k][j],i为起点,k为中间点,j为终点,所以显然他时间复杂度自然是高贵的O(n^3)(大数据会被卡TLE)
Floyd可以精简的概况为起点,中点与终点,很容易联系到arr[i][k]到arr[k][j],i为起点,k为中间点,j为终点,所以显然他时间复杂度自然是高贵的O(n^3)(大数据会被卡TLE)
HDU一道例题
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;
}