CodeForces-545E.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #include <functional>
  2. #include <iostream>
  3. #include <limits>
  4. #include <queue>
  5. #include <utility>
  6. #include <vector>
  7. using namespace std;
  8. struct Edge { int to, id; long long weight; };
  9. int main() {
  10. ios::sync_with_stdio(false);
  11. cin.tie(nullptr);
  12. int n, m; cin >> n >> m;
  13. vector<vector<Edge>> g(n);
  14. for (int id = 0; id < m; ++id) {
  15. int u, v; long long w; cin >> u >> v >> w; --u; --v;
  16. g[u].push_back({v, id, w}); g[v].push_back({u, id, w});
  17. }
  18. int source; cin >> source; --source;
  19. const long long inf = numeric_limits<long long>::max() / 4;
  20. vector<long long> dist(n, inf), parent_weight(n, inf);
  21. vector<int> parent_edge(n, -1);
  22. priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<>> pq;
  23. dist[source] = 0; pq.push({0, source});
  24. while (!pq.empty()) {
  25. auto [d, u] = pq.top(); pq.pop();
  26. if (d != dist[u]) continue;
  27. for (Edge e : g[u]) {
  28. long long candidate = d + e.weight;
  29. if (candidate < dist[e.to]) {
  30. dist[e.to] = candidate;
  31. parent_weight[e.to] = e.weight;
  32. parent_edge[e.to] = e.id;
  33. pq.push({candidate, e.to});
  34. } else if (candidate == dist[e.to] && e.weight < parent_weight[e.to]) {
  35. parent_weight[e.to] = e.weight;
  36. parent_edge[e.to] = e.id;
  37. }
  38. }
  39. }
  40. long long total = 0;
  41. for (int v = 0; v < n; ++v) if (v != source) total += parent_weight[v];
  42. cout << total << '\n';
  43. for (int v = 0; v < n; ++v) if (v != source) cout << parent_edge[v] + 1 << ' ';
  44. cout << '\n';
  45. }