Advertisement
jw910731

MST

Nov 20th, 2018
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.10 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. /************************/
  4. #define MAX_N 100000
  5. #define MAX_M 200000
  6. typedef struct{
  7.     int f[MAX_N];
  8.     void init(int N){
  9.         for(int i=0;i<N;i++)
  10.             f[i] = i;
  11.     }
  12.     int find(int v){
  13.         if(f[v] == v) return v;
  14.         return f[v] = find(f[v]);
  15.     }
  16.     bool same(int a, int b){
  17.         return find(a) == find(b);
  18.     }
  19.     void Union(int a, int b){
  20.         f[find(a)] = find(b);
  21.     }
  22. }disjoinset;
  23. typedef struct{
  24.     int d1,d2,w; // d = destination, w = weight
  25. }edge;
  26. edge E[MAX_M];
  27. int main(){
  28.     int n,m;
  29.     while(scanf("%d%d",&n,&m) != EOF){
  30.         int p,q,c; // p & q = two vert of a edge, c = weight of edge
  31.         for(int i=0;i<m;i++){
  32.             scanf("%d%d%d",&p,&q,&c);
  33.             E[i] = (edge){p,q,c};
  34.         }
  35.         sort(E,E+m,[](edge a, edge b){return a.w < b.w;}); // sort Edges
  36.         //Kruskal
  37.         disjoinset ds;
  38.         ds.init(n);
  39.         int sum=0,count=0;
  40.         for(int i=0;i<m;i++){
  41.             if(!ds.same(E[i].d1,E[i].d2)){
  42.                 count++;
  43.                 sum += E[i].w;
  44.                 ds.Union(E[i].d1,E[i].d2);
  45.             }
  46.             if(count == n-1) break;
  47.         }
  48.         //Ouput
  49.         if(count == n-1)
  50.             printf("%d\n",sum);
  51.         else
  52.             printf("-1\n");
  53.     }
  54.     return 0;
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement