题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805464397627392
这题挺经典的,可以用来熟悉Dijkstra算法
代码
纯Dijkstra算法
#include<algorithm>#include<iostream>#include<cstdio>#include<vector>using namespace std;const int maxn = 510;const int inf = 0x3fffffff;int n, m, st, ed;int G[maxn][maxn], cost[maxn][maxn], pre[maxn], d[maxn], c[maxn];bool vis[maxn] = {false};void Dijkstra(int s){fill(d, d + maxn, inf);fill(c, c + maxn, inf);d[s] = 0;c[s] = 0;for(int i = 0; i < n; i++) pre[i] = i;for(int i = 0 ; i < n; i++){int u = -1, min = inf;for(int j = 0; j < n; j++){if(vis[j] == false && d[j] < min){u = j;min = d[j];}}if(u == -1) return;vis[u] = true;for(int v = 0; v < n; v++){if(vis[v] == false && G[u][v] != inf){if(G[u][v] + d[u] < d[v]){d[v] = G[u][v] + d[u];c[v] = cost[u][v] + c[u];pre[v] = u;} else if(d[v] == G[u][v] + d[u]){if(c[v] > cost[u][v] + c[u]){c[v] = cost[u][v] + c[u];pre[v] = u;}}}}}}void DFS(int v){if(v == st){printf("%d ", v);return;}DFS(pre[v]);printf("%d ",v);}int main(){scanf("%d%d%d%d", &n, &m, &st, &ed);int c1, c2, temp_d, temp_c;fill(G[0], G[0] + maxn * maxn, inf);for(int i = 0; i < m; i++){scanf("%d%d%d%d", &c1, &c2, &temp_d, &temp_c);G[c1][c2] = G[c2][c1] = temp_d;cost[c1][c2] = cost[c2][c1] = temp_c;}Dijkstra(st);DFS(ed);printf("%d %d\n", d[ed], c[ed]);return 0;}
Dijkstra + DFS
感觉用不太上,熟悉第一种写法就够了.jpg 注意DFS函数的写法!!!
#include<cstdio>#include<cstring>#include<vector>#include<algorithm>using namespace std;const int maxn = 510;const int inf = 1000000000;int n, m, st, ed, G[maxn][maxn], cost[maxn][maxn];int d[maxn], minCost = inf;bool vis[maxn] = {false};vector<int> pre[maxn];vector<int> tempPath, path;void Dijkstra(int s){fill(d, d + maxn, inf);d[s] = 0;for(int i = 0 ; i < n; i++){int u = -1, min = inf;for(int j = 0; j < n; j++){if(vis[j] == false && d[j] < min){u = j;min = d[j];}}if(u == -1)return;vis[u] = true;for(int v = 0; v < n; v++){if(vis[v] == false && G[u][v] != inf){if(d[v] > d[u] + G[u][v]){d[v] = d[u] + G[u][v];pre[v].clear();pre[v].push_back(u);} else if(d[v] == d[u] + G[u][v]){pre[v].push_back(u);}}}}}void DFS(int v){if(v == st){tempPath.push_back(v);int tempCost = 0;for(int i = tempPath.size() - 1; i > 0; i--){int id = tempPath[i], idNext = tempPath[i - 1];tempCost += cost[id][idNext];}if(tempCost < minCost){minCost = tempCost;path = tempPath;}tempPath.pop_back();return;}tempPath.push_back(v);for(int i = 0; i < pre[v].size(); i++){DFS(pre[v][i]);}tempPath.pop_back();}int main(){scanf("%d%d%d%d", &n, &m, &st, &ed);int c1, c2, temp_d, temp_c;fill(G[0], G[0] + maxn * maxn, inf);for(int i = 0; i < m; i++){scanf("%d%d%d%d", &c1, &c2, &temp_d, &temp_c);G[c1][c2] = G[c2][c1] = temp_d;cost[c1][c2] = cost[c2][c1] = temp_c;}Dijkstra(st);DFS(ed);for(int i = path.size() - 1; i >= 0; i--){printf("%d ", path[i]);}printf("%d %d\n", d[ed], minCost);return 0;}
