Dijkstra过程中动态记录最短路径数量ways和最大资源数resources。
#include <bits/stdc++.h>
using namespace std;
void printPath(vector<int>& pres, int start, int end) {
if (start == end) {
cout << start;
return;
}
printPath(pres, start, pres[end]);
cout << ' ' << end;
}
int main() {
int n, m, start, end;
cin >> n >> m >> start >> end;
vector<int> values(n, 0);
vector<vector<int>> adj(n, vector<int>(n, INT_MAX / 2));
for (int i = 0; i < n; ++i) {
cin >> values[i];
}
for (int i = 0; i < m; ++i) {
int s, e, l;
cin >> s >> e >> l;
adj[s][e] = l;
adj[e][s] = l;
}
vector<int> dist(n, INT_MAX / 2);
vector<int> ways(n, 0), resources(n, 0);
vector<bool> done(n, false);
vector<int> pres(n, -1);
ways[start] = 1;
dist[start] = 0;
for (int i = 0; i < n; ++i) {
resources[i] = values[i];
}
//resources[start] = values[start];
while (true) {
int min_idx = -1;
int min_value = INT_MAX;
for (int i = 0; i < n; ++i) {
if (done[i] || dist[i] >= min_value) continue;
min_idx = i;
min_value = dist[min_idx];
}
if (min_idx == -1) break;
done[min_idx] = true;
for (int i = 0; i < n; ++i) {
if (done[i]) continue;
if (dist[min_idx] + adj[min_idx][i] < dist[i]) {
dist[i] = dist[min_idx] + adj[min_idx][i];
ways[i] = ways[min_idx];
resources[i] = resources[min_idx] + values[i];
pres[i] = min_idx;
}
else if (dist[min_idx] + adj[min_idx][i] == dist[i]) {
ways[i] += ways[min_idx];
if (resources[i] < resources[min_idx] + values[i]) {
resources[i] = resources[min_idx] + values[i];
pres[i] = min_idx;
}
}
}
}
cout << ways[end] << ' ' << resources[end] << endl;
printPath(pres, start, end);
cout << endl;
return 0;
}