Advertisement
MinhNGUYEN2k4

Untitled

Sep 13th, 2021
944
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.67 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 50005
  11. #define remain(x) if (x > MOD) x -= MOD
  12. #define ii pair<int, int>
  13. #define iiii pair< ii , ii >
  14. #define viiii vector< iiii >
  15. #define vi vector<int>
  16. #define vii vector< ii >
  17. #define bit(x, i) (((x) >> (i)) & 1)
  18. #define Task "test"
  19. #define int long long
  20.  
  21. using namespace std;
  22.  
  23. typedef long double ld;
  24. const int inf = 1e9*5e6;
  25. const int minf = -1e9*5e6;
  26.  
  27. int n, m;
  28. struct edges{
  29.     int u, v, w;
  30.     //edges(int uu, int vv, int ww) {u = uu; v = vv; w = ww;}
  31.     bool operator < (edges& e){
  32.         return e.w > w;
  33.     }
  34. };
  35. edges e[500005];
  36. vector<ii> g[50005];
  37. int f[50005][20];
  38. int cha[50005][20];
  39. int d[50005];
  40.  
  41. void readfile()
  42. {
  43.     ios_base::sync_with_stdio(false);
  44.     cin.tie(0);cout.tie(0);
  45.     if (fopen(Task".inp","r"))
  46.     {
  47.         freopen(Task".inp","r",stdin);
  48.         //freopen(Task".out","w",stdout);
  49.     }
  50.     cin >> n >> m;
  51.     for(int i=1; i<=m; i++){
  52.         cin >> e[i].u >> e[i].v >> e[i].w;
  53.     }
  54.     sort(e+1,e+1+m);
  55.     //for(int i=1; i<=m; i++) cout << e[i].w << endl;
  56. }
  57.  
  58. vector<int> id_of_1st_mst;
  59. vector<int> id_of_2nd_mst;
  60. int par[N];
  61.  
  62. int get(int u){
  63.     return (u == par[u] ? u : par[u] = get(par[u]));
  64. }
  65.  
  66. void join(int u, int v){
  67.     par[v] = u;
  68. }
  69.  
  70.  
  71.  
  72. void dfs(int u, int pre){
  73.     for(int i=1; i<20; i++)
  74.     {
  75.         cha[u][i] = cha[cha[u][i-1]][i-1];
  76.         f[u][i] = max(f[u][i-1],f[cha[u][i-1]][i-1]);
  77.     }
  78.     for(auto i : g[u]){
  79.         int v = i.fi;
  80.         int uv = i.se;
  81.         if (v==pre) continue;
  82.         if (v!=pre){
  83.             f[v][0] = uv;
  84.             cha[v][0] = u;
  85.             d[v] = d[u] + 1;
  86.             dfs(v,u);
  87.         }
  88.     };
  89. }
  90.  
  91. int lca(int u, int v){
  92.     if (d[u] < d[v]) swap(u,v);
  93.     int delta = d[u] - d[v];
  94.     for(int i=19; i>=0; i--){
  95.         if (bit(delta,i)) u = cha[u][i];
  96.     }
  97.     if (u==v) return u;
  98.     for(int i=19; i>=0; i--){
  99.         if (cha[u][i]!=cha[v][i]){
  100.             u=cha[u][i];
  101.             v=cha[v][i];
  102.         }
  103.     }
  104.     return cha[u][0];
  105. }
  106.  
  107. int calc(int u, int v){
  108.     int z = lca(u,v);
  109.     int res = minf;
  110.     int delta = d[u] - d[z];
  111.     if (delta!=0) for(int i=19; i>=0; i--){
  112.         if (bit(delta,i)){
  113.             res = max(res,f[u][i]);
  114.             u=cha[u][i];
  115.         }
  116.  
  117.     }
  118.     delta = d[v] - d[z];
  119.     if (delta!=0) for(int i=19; i>=0; i--){
  120.         if (bit(delta,i)){
  121.             res = max(res,f[v][i]);
  122.             v = cha[v][i];
  123.         }
  124.     }
  125.     return res;
  126. }
  127.  
  128. void proc()
  129. {
  130.     int ans1=0;
  131.     for(int i=1; i<=n; i++) par[i] = i;
  132.     for(int i=1; i<=m; i++){
  133.         int u = e[i].u; int preu = u;
  134.         int v = e[i].v; int prev = v;
  135.         int w = e[i].w;
  136.         if (get(u)!=get(v)){
  137.             u = get(u);
  138.             v = get(v);
  139.             id_of_1st_mst.pb(i);
  140.             //cout << preu << ' ' << prev << ' ' << w << endl;
  141.             join(u,v);
  142.             ans1+=w;
  143.         }
  144.         else id_of_2nd_mst.pb(i);
  145.     }
  146.     cout << ans1 << '\n';
  147.     for(auto i : id_of_1st_mst){
  148.         int u = e[i].u; int v  = e[i].v;
  149.         g[u].pb(ii(v,e[i].w));
  150.         g[v].pb(ii(u,e[i].w));
  151.     }
  152.     dfs(1,1);
  153.     int tmp = inf;
  154.     for(auto j : id_of_2nd_mst){
  155.         int u = e[j].u;
  156.         int v = e[j].v;
  157.         //cout << u << ' ' << v << ' ' << e[j].w << endl;
  158.         //cout << calc(u,v) << endl;
  159.         tmp = min(tmp,e[j].w-calc(u,v));
  160.     }
  161.     cout << ans1 + tmp;
  162. }
  163.  
  164. signed main()
  165. {
  166.     readfile();
  167.     proc();
  168.     return 0;
  169. }
  170.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement