典型的dijk+dfs能解的问题。
#include<cstdio>
#include<algorithm>
#include<string>
#include<vector>
#include<iostream>
#define maxn 5050
#define inf 10001000
using namespace std;
struct road {
int nest, dist, cost;
road() {}
road(int n, int d, int c) : nest(n), dist(d), cost(c) {}
};
vector<road> g[maxn];
bool visit[maxn];
int disttemp[maxn];
vector<int> before[maxn];
vector<int> temp, out;
int mincost = inf, tempcost = 0;
void dfs(int now, int S) {
if (now == S) {
if (tempcost < mincost) {
out = temp;
mincost = tempcost;
}
return;
}
for (int i = 0; i < before[now].size(); i++) {
temp.push_back(before[now][i]);
road t;
for (int j = 0; j < g[now].size(); j++) {
t = g[now][j];
if (t.nest == before[now][i]) {
tempcost += t.cost;
break;
}
}
dfs(before[now][i], S);
temp.pop_back();
tempcost -= t.cost;
}
return;
}
void dijk(int start, int N, int D) {
int tn = N;
fill(visit, visit + N + 1, false);
fill(disttemp, disttemp + N + 1, inf);
disttemp[start] = 0;
while(tn--) {
int minone = N;
for (int i = 0; i < N; i++) {
if (visit[i] == false && disttemp[i] < disttemp[minone]) minone = i;
}
visit[minone] = true;
if (minone == D) return;
for (int i = 0; i < g[minone].size(); i++) {
road t = g[minone][i];
if (visit[t.nest] == false && disttemp[minone] + t.dist < disttemp[t.nest]) {
disttemp[t.nest] = disttemp[minone] + t.dist;
before[t.nest].clear();
before[t.nest].push_back(minone);
}
else if (visit[t.nest] == false && disttemp[minone] + t.dist == disttemp[t.nest]) {
before[t.nest].push_back(minone);
}
}
}
}
int main() {
int N, M, S, D;
scanf("%d %d %d %d", &N, &M, &S, &D);
int c1, c2, d, c;
while (M--) {
scanf("%d %d %d %d", &c1, &c2, &d, &c);
g[c1].push_back(road(c2, d, c));
g[c2].push_back(road(c1, d, c));
}
dijk(S, N, D);
dfs(D, S);
for (int i = out.size() - 1; i >= 0; i--) {
printf("%d ", out[i]);
}
printf("%d %d %d", D, disttemp[D], mincost);
}