Advertisement
apl-mhd

zitusirkruskal

May 25th, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include <iostream>
  2. #include<cstdio>
  3. #include <vector>
  4. #include <queue>
  5. using namespace std;
  6. #define MAX_N 101
  7.  
  8.  
  9. int m,n,wt=0;
  10.  
  11.  
  12. struct Set{
  13.     int parent, rnk;
  14. };
  15.  
  16. struct Edge{
  17.  
  18.     int u, v,w;
  19.  
  20.     bool operator<(const Edge& rhs) const {
  21.  
  22.         return w > rhs.w;
  23.     }
  24.  
  25. };
  26.  
  27. Set S[MAX_N];
  28. priority_queue<Edge> q;
  29. vector<pair<int,int> > mstEdge;
  30.  
  31.  
  32.  
  33. void read_graph() {
  34.  
  35.  
  36.     for (int i = 0; i <m ; ++i) {
  37.  
  38.         Edge temp;
  39.  
  40.         scanf("%d%d%d",&temp.u, &temp.v, &temp.w);
  41.         q.push(temp);
  42.  
  43.     }
  44.  
  45.  
  46. }
  47.  
  48. void make_set(){
  49.  
  50.     for(int i=0; i<n; i++){
  51.         S[i].parent = i;
  52.         S[i].rnk = 0;
  53.  
  54.     }
  55. }
  56.  
  57.  
  58.  
  59. int find_set(int x){
  60.  
  61.     if(S[x].parent !=x)
  62.         return S[x].parent = find_set(S[x].parent);
  63.     return x;
  64. }
  65.  
  66.  
  67. void link(int u, int v){
  68.  
  69.     if(S[u].rnk > S[v].rnk){
  70.  
  71.         S[v].parent = u;
  72.     }
  73.     else{
  74.  
  75.         S[u].parent = v;
  76.         if(S[u].rnk ==S[v].rnk)
  77.             S[v].rnk++;
  78.  
  79.     }
  80. }
  81.  
  82.  
  83.  
  84. void ds_union(int x, int y, int w){
  85.     int u = find_set(x);
  86.     int v = find_set(y);
  87.  
  88.     if(u != v) {
  89.  
  90.         wt +=w;
  91.         mstEdge.push_back(make_pair(x,y));
  92.  
  93.         link(u, v);
  94.     }
  95.  
  96. }
  97.  
  98.  
  99.  
  100.  
  101.  
  102. void kruskal() {
  103.  
  104.  
  105.     make_set();
  106.  
  107.     while(!q.empty()){
  108.  
  109.         Edge temp = q.top();
  110.  
  111.         ds_union(temp.u, temp.v,temp.w);
  112.         q.pop();
  113.  
  114.     }
  115.  
  116.  
  117.  
  118. }
  119.  
  120. void print_mst() {
  121.  
  122.     for (int i = 0; i <mstEdge.size() ; ++i) {
  123.  
  124.         pair<int, int> temp = mstEdge[i];
  125.        
  126.         printf("%d %d\n",temp.first,temp.second);
  127.    
  128.     }
  129.  
  130.  
  131.     cout<<wt<<endl;
  132.  
  133. }
  134.  
  135.  
  136. int main() {
  137.  
  138.     freopen("input.txt", "r", stdin);
  139.  
  140.     scanf("%d%d",&n,&m);
  141.  
  142.     read_graph();
  143.  
  144.     kruskal();
  145.  
  146.     print_mst();
  147.  
  148.  
  149.     return 0;
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement