收获:
彻底弄懂最短路径问题 - 加拿大小哥哥 - 博客园
dijikstra处理单源最短路径问题
SPFA
SPFA算法学习笔记 - 加拿大小哥哥 - 博客园
Bellman-Ford
数据结构(十一):最短路径(Bellman-Ford算法) - 简书
代码:
#include <iostream>
#include <cstring>
using namespace std;
#define N 505
#define INF 1000
int main() {
int n, m, s, d;
cin >> n >> m >> s >> d;
int map[N][N][2];
int visited[N];
memset(visited, 0, sizeof(visited));
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
if(i == j)
map[i][j][0] = map[i][j][1] = 0;
else
map[i][j][0] = map[i][j][1] = INF;
while(m--) {
int a, b, c, e;
cin >> a >> b >> c >> e;
map[a][b][0] = map[b][a][0] = c;
map[a][b][1] = map[b][a][1] = e;
}
visited[s] = 1;
// 本质上Dijkstra是一种生成最小生成树的走法,所以最多只要走n-1次就一定能得到结果
for(int i = 0; i < n; i++) {
int min = INF;
int k = -1;
for(int j = 0; j < n; j++)
if(!visited[j] && min > map[s][j][0]) {
k = j;
min = map[s][j][0];
}
// 退出机制
if(k == -1)
break;
else
visited[k] = 1;
for(int j = 0; j < n; j++) {
// 有些博主的代码中还会有map[s][j][0] < INF的情况
// 这里因为我们取的INF比较少,因此不用担心INF相加整型溢出所以不需要加
if(!visited[j])// 松弛操作
if(map[s][j][0] > map[s][k][0] + map[k][j][0] ||
(map[s][j][0] == map[s][k][0] + map[k][j][0] && map[s][j][1] > map[s][k][1] + map[k][j][1])){
map[s][j][0] = map[s][k][0] + map[k][j][0];
map[s][j][1] = map[s][k][1] + map[k][j][1];
}
}
}
cout << map[s][d][0] << " " << map[s][d][1] << endl;
return 0;
}
题目: