解法一:Dijkstra
#include <bits/stdc++.h>
using namespace std;
const int N = 505;
const int INF = 0x3f3f3f3f;
class Edge {
public:
int v;
int dis;
int cost;
Edge() {}
Edge(int v, int dis, int cost) : v(v), dis(dis), cost(cost) {}
};
vector<Edge> graph[N];
bool vis[N];
int dis[N];
int cost[N];
int pre[N];
int n, m, s, d;
void dijkstra(int s, int d) {
memset(vis, false, sizeof(vis));
fill(dis, dis + N, INF);
fill(cost, cost + N, INF);
dis[s] = 0;
cost[s] = 0;
while (!vis[d]) {
int min = 0x3f3f3f3f;
int u = -1;
for (int i = 0; i < n; ++i) {
if (!vis[i] && dis[i] < min) {
u = i;
min = dis[i];
}
}
if (u == -1) {
break;
}
vis[u] = true;
for (Edge edge:graph[u]) {
if ((dis[u] + edge.dis < dis[edge.v]) ||
((dis[u] + edge.dis == dis[edge.v]) && (cost[u] + edge.cost < cost[edge.v]))) {
dis[edge.v] = dis[u] + edge.dis;
pre[edge.v] = u;
cost[edge.v] = cost[u] + edge.cost;
}
}
}
}
void printPath(int s, int d) {
if (s == d) {
cout << d << " ";
return;
}
printPath(s, pre[d]);
cout << d << " ";
}
int main() {
ios::sync_with_stdio(false);
cin >> n >> m >> s >> d;
int u, v, _dis, _cost;
for (int i = 0; i < m; ++i) {
cin >> u >> v >> _dis >> _cost;
graph[u].emplace_back(Edge(v, _dis, _cost));
graph[v].emplace_back(Edge(u, _dis, _cost));
}
dijkstra(s, d);
printPath(s, d);
cout << dis[d] << " " << cost[d] << '\n';
}