Advertisement
apl-mhd

maximumspanningtree

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