解法一: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';}