Advertisement
apl-mhd

secondMinimum

May 14th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.73 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.  
  45.  
  46. struct Set{
  47.     int parent, rnk;
  48. };
  49.  
  50. struct Edge{
  51.  
  52.     int u, v,w;
  53.  
  54.     bool operator<(const Edge& rhs) const { //sort decending order by weight
  55.  
  56.         return w > rhs.w;
  57.     }
  58.  
  59. };
  60.  
  61. Set S[MAX_N];
  62. Edge E[MAX_M];
  63.  
  64. int n, m;
  65. int secndminSpt = 0;
  66. vector<vector<pair<int, int>>> adjL;
  67.  
  68. vector<Edge> vEdge;
  69. vector<int> bestspanning;
  70.  
  71.  
  72. priority_queue<Edge> q, qsecond; //for (u,v) maximum weight
  73.  
  74.  
  75.  
  76. void make_set(){
  77.  
  78.     for(int i=0; i<n; i++){
  79.         S[i].parent = i;
  80.         S[i].rnk = 0;
  81.  
  82.     }
  83. }
  84.  
  85. int find_set(int x){
  86.  
  87.     if(S[x].parent !=x)
  88.         return S[x].parent = find_set(S[x].parent);
  89.     return x;
  90. }
  91.  
  92.  
  93. void link(int u, int v){
  94.  
  95.     if(S[u].rnk > S[v].rnk){
  96.  
  97.         S[v].parent = u;
  98.     }
  99.     else{
  100.  
  101.         S[u].parent = v;
  102.         if(S[u].rnk ==S[v].rnk)
  103.             S[v].rnk++;
  104.  
  105.     }
  106. }
  107.  
  108.  
  109.  
  110. void  ds_union(int x, int y, int w){
  111.     int u = find_set(x);
  112.     int v = find_set(y);
  113.  
  114.  
  115.     if(u != v) {
  116.  
  117.         secndminSpt += w;
  118.         link(u, v);
  119.  
  120.  
  121.     }
  122.  
  123. }
  124.  
  125. void minimumSpanning(){
  126.     adjL.resize(100);
  127.  
  128.     make_set();
  129.  
  130.     while(!q.empty()){
  131.  
  132.         Edge temp = q.top();
  133.        
  134.         vEdge.push_back(temp);
  135.  
  136.         qsecond.push(temp);
  137.  
  138.         ds_union(temp.u, temp.v,temp.w);
  139.  
  140.         q.pop();
  141.  
  142.     }
  143.  
  144.  
  145. }
  146.  
  147. void secondBestSpannigTree(){
  148.  
  149.    
  150.     bestspanning.push_back(secndminSpt);
  151.  
  152.  
  153.     for (int i = 0; i <vEdge.size() ; ++i) {
  154.  
  155.         make_set();
  156.        
  157.         for (int j = 0; j < vEdge.size(); ++j) {
  158.  
  159.  
  160.             if(j !=i) {
  161.  
  162.                 Edge e = vEdge[j];
  163.                 ds_union(e.u, e.v, e.w);
  164.             }
  165.         }
  166.  
  167.        
  168.         bestspanning.push_back(secndminSpt);
  169.         secndminSpt=0;
  170.  
  171.     }
  172.  
  173.    
  174. }
  175.  
  176.  
  177.  
  178. int main()
  179. {
  180.    
  181.  
  182.     freopen("graph3.txt", "r", stdin);
  183.  
  184.     scanf("%d%d",&n,&m);
  185.  
  186.  
  187.     for(int i=0; i<m;i++){
  188.  
  189.         Edge temp;
  190.         scanf("%d%d%d",&temp.u, &temp.v, &temp.w);
  191.  
  192.         q.push(temp);
  193.  
  194.        
  195.     }
  196.  
  197.    
  198.     minimumSpanning();
  199.  
  200.     cout<<secndminSpt<<endl<<endl;
  201.  
  202.  
  203.     secondBestSpannigTree();
  204.    
  205.     sort(bestspanning.begin(),bestspanning.end());
  206.  
  207.  
  208.     cout<<bestspanning[1];
  209.    
  210.    
  211.     return 0;
  212. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement