解法一:Dijkstra

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 505;
  4. const int INF = 0x3f3f3f3f;
  5. class Edge {
  6. public:
  7. int v;
  8. int dis;
  9. int cost;
  10. Edge() {}
  11. Edge(int v, int dis, int cost) : v(v), dis(dis), cost(cost) {}
  12. };
  13. vector<Edge> graph[N];
  14. bool vis[N];
  15. int dis[N];
  16. int cost[N];
  17. int pre[N];
  18. int n, m, s, d;
  19. void dijkstra(int s, int d) {
  20. memset(vis, false, sizeof(vis));
  21. fill(dis, dis + N, INF);
  22. fill(cost, cost + N, INF);
  23. dis[s] = 0;
  24. cost[s] = 0;
  25. while (!vis[d]) {
  26. int min = 0x3f3f3f3f;
  27. int u = -1;
  28. for (int i = 0; i < n; ++i) {
  29. if (!vis[i] && dis[i] < min) {
  30. u = i;
  31. min = dis[i];
  32. }
  33. }
  34. if (u == -1) {
  35. break;
  36. }
  37. vis[u] = true;
  38. for (Edge edge:graph[u]) {
  39. if ((dis[u] + edge.dis < dis[edge.v]) ||
  40. ((dis[u] + edge.dis == dis[edge.v]) && (cost[u] + edge.cost < cost[edge.v]))) {
  41. dis[edge.v] = dis[u] + edge.dis;
  42. pre[edge.v] = u;
  43. cost[edge.v] = cost[u] + edge.cost;
  44. }
  45. }
  46. }
  47. }
  48. void printPath(int s, int d) {
  49. if (s == d) {
  50. cout << d << " ";
  51. return;
  52. }
  53. printPath(s, pre[d]);
  54. cout << d << " ";
  55. }
  56. int main() {
  57. ios::sync_with_stdio(false);
  58. cin >> n >> m >> s >> d;
  59. int u, v, _dis, _cost;
  60. for (int i = 0; i < m; ++i) {
  61. cin >> u >> v >> _dis >> _cost;
  62. graph[u].emplace_back(Edge(v, _dis, _cost));
  63. graph[v].emplace_back(Edge(u, _dis, _cost));
  64. }
  65. dijkstra(s, d);
  66. printPath(s, d);
  67. cout << dis[d] << " " << cost[d] << '\n';
  68. }