最短路:
1.单源:
多源:
2.任意两点:
dijkstra算法:
本质思想:动态规划
dist[i]:从S到达i的最短距离
单源最短路:dijkstra算法
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2000 + 5;
const int maxw = 10000; // 边权最大
const int maxm = 1000; // 边的最多个数
const int inf = maxw * maxm + 1;
vector<pair<int,int>> e[maxn];
int dist[maxn] , bk[maxn];
int main()
{
int n , m; cin >> n >> m;
for (int i = 1 ; i <= m ; i++){
int x , y , z; cin >> x >> y >> z;
e[x].push_back(make_pair(y , z));
e[y].push_back(make_pair(x , z));
}
int s ; cin >> s; // 起点
// 0.初始化
for (int i = 1 ; i <= n ; i++)
dist[i] = inf;
dist[s] = 0;
// 1.正式进入算法部分
for (int i = 1 ; i <= n ; i++){
int mi = inf;
int x;
// 1.1 找最近
for (int j = 1 ; j <= n ; j++){
if (bk[j] == 1) continue;
if (mi > dist[j]){
mi = dist[j];
x = j;
}
}
// 1.2 把x放入p
bk[x] = 1;
// 1.3 松弛
for (auto g : e[x]){
int v = g.first , w = g.second;
dist[v] = min(dist[v] , dist[x] + w);
}
}
for (int i = 1 ; i <= n ; i++){
cout <<dist[i] << endl;
}
return 0;
}
/*
5 5
1 2 1
1 4 2
2 3 3
4 3 7
3 5 4
*/
// 0 1 4 2 8
任意两点最短路:floyd 算法
// 任意两点间的最短路
for (int k = 1 ; k <= n ; k++)
for (int i = 1 ; i <= n ; i++)
for (int j = 1 ; j <= n ; j++)
dp[i][j] = min(dp[i][j] , dp[i][k] + dp[k][j]);
拓扑排序:本质bfs