Advertisement
MinhNGUYEN2k4

Untitled

Sep 10th, 2021
974
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 KB | None | 0 0
  1. //Nguyen Huu Hoang Minh
  2. #include <bits/stdc++.h>
  3. #define sz(x) int(x.size())
  4. #define all(x) x.begin(),x.end()
  5. #define reset(x) memset(x, 0,sizeof(x))
  6. #define pb push_back
  7. #define mp make_pair
  8. #define fi first
  9. #define se second
  10. #define N 300005
  11. #define remain(x) if (x > MOD) x -= MOD
  12. #define ii pair<int, int>
  13. #define iii pair<ii, int>
  14. #define iiii pair< ii , ii >
  15. #define viiii vector< iiii >
  16. #define vi vector<int>
  17. #define vii vector< ii >
  18. #define bit(x, i) (((x) >> (i)) & 1)
  19. #define Task "test"
  20. #define int long long
  21.  
  22. using namespace std;
  23.  
  24. typedef long double ld;
  25. const int inf = 1e10;
  26. const int minf = -1e10;
  27.  
  28. int n, m;
  29. struct edges{
  30.     int u, v, w, id;
  31. };
  32. vector<iii> g[N];
  33. edges e[N];
  34. int capital;
  35. int d[N];
  36. int used[N];
  37.  
  38. void readfile()
  39. {
  40.     ios_base::sync_with_stdio(false);
  41.     cin.tie(0);cout.tie(0);
  42.     if (fopen(Task".inp","r"))
  43.     {
  44.         freopen(Task".inp","r",stdin);
  45.         //freopen(Task".out","w",stdout);
  46.     }
  47.     cin >> n >> m;
  48.     for(int i=1; i<=m; i++){
  49.         int u, v, w;
  50.         cin >> u >> v >> w;
  51.         g[u].pb(iii(ii(v,w),i));
  52.         g[v].pb(iii(ii(u,w),i));
  53.         e[i].u = u; e[i].v = v; e[i].w = w; e[i].id = i;
  54.     }
  55.     cin >> capital;
  56. }
  57.  
  58. void djk(){
  59.     set<ii> q;
  60.     for(int i=1; i<=n; i++) d[i] = inf;
  61.     d[capital] = 0;
  62.     q.insert({0,capital});
  63.     while (q.size()){
  64.         ii node = *q.begin();
  65.         q.erase(q.begin());
  66.         int u = node.se;
  67.         if (d[u]!=node.fi) continue;
  68.         //cout << u << ' ' << d[u] << endl;
  69.         for(auto i : g[u]){
  70.             int v = i.fi.fi;
  71.             int uv = i.fi.se;
  72.             int id = i.se;
  73.             if (d[v] > d[u] + uv){
  74.                 d[v] = node.fi + uv;
  75.                 used[v] = id;
  76.                 q.insert({d[v],v});
  77.             }
  78.             else if (d[v] == d[u] + uv){
  79.                 if (e[used[v]].w > e[id].w) used[v] = id;
  80.             }
  81.         }
  82.     }
  83. }
  84.  
  85. void proc()
  86. {
  87.     djk();
  88.     int ans = 0;
  89.     for(int i=1; i<=n; i++){
  90.         if (i!=capital){
  91.             ans += e[used[i]].w;
  92.         }
  93.     }
  94.     cout << ans << '\n';
  95.     for(int i=1; i<=n; i++){
  96.         if (i!=capital) cout << used[i] << ' ';
  97.     }
  98. }
  99.  
  100. signed main()
  101. {
  102.     readfile();
  103.     proc();
  104.     return 0;
  105. }
  106.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement