Advertisement
Guest User

1095F - Make It Connected

a guest
Nov 17th, 2019
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. const int maxN = (int)2e5;
  8. int parent[maxN];
  9. long long a[maxN];
  10.  
  11. void make_set(int v) {
  12.     parent[v] = v;
  13. }
  14.  
  15. int find_set(int v) {
  16.     if (v == parent[v])
  17.         return v;
  18.     return parent[v]=find_set(parent[v]);
  19. }
  20.  
  21. void union_set(int u, int v) {
  22.     u = find_set(u);
  23.     v = find_set(v);
  24.     if(u==v) return;
  25.     if (a[u] < a[v]){
  26.         parent[v] = u;
  27.         a[v] = a[u];
  28.     } else {
  29.         parent[u] = v;
  30.         a[u] = a[v];
  31.     }
  32. }
  33.  
  34. int main()
  35. {
  36.     ios::sync_with_stdio(false);
  37.     int n;
  38.     int m;
  39.     cin>>n>>m;
  40.     for (int i=0; i<n; i++){
  41.         cin>>a[i];
  42.     }
  43.  
  44.     vector<pair<long long,pair<int,int>>> possibleEdges;
  45.     for (int i=0; i<m; i++){
  46.         int x;
  47.         int y;
  48.         long long w;
  49.         cin>>x>>y>>w;
  50.         possibleEdges.push_back({w,{x-1,y-1}});
  51.     }
  52.  
  53.     long long rootWeight = a[0];
  54.     int root = 0;
  55.     for (int i=1; i<n; i++){
  56.         if (rootWeight > a[i]){
  57.             root = i;
  58.             rootWeight = a[i];
  59.         }
  60.     }
  61.  
  62.     for (int i=0; i<n; i++){
  63.         if (i != root){
  64.             possibleEdges.push_back({rootWeight+a[i],{root, i}});
  65.         }
  66.     }
  67.  
  68.     sort(possibleEdges.begin(),possibleEdges.end());
  69.  
  70.     long long coins = 0LL;
  71.     for (int i=0; i<n; i++){
  72.         make_set(i);
  73.     }
  74.     for (int i=0; i<possibleEdges.size(); i++){
  75.         int uSet = find_set(possibleEdges[i].second.first);
  76.         int vSet = find_set(possibleEdges[i].second.second);
  77.         if (uSet != vSet){
  78.             coins+=possibleEdges[i].first;
  79.             union_set(uSet,vSet);
  80.         }
  81.     }
  82.     cout<<coins<<endl;
  83.     return 0;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement