ivolff

CHM2.0

Nov 11th, 2017
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.86 KB | None | 0 0
  1. //
  2. //  main.cpp
  3. //  console_her
  4. //
  5. //  Created by Святой Отец on 26.06.17.
  6. //  Copyright © 2017 Святой Отец. All rights reserved.
  7. //
  8.  
  9. #include <cstdlib>
  10. #include <fstream>
  11. #include <iostream>
  12. #include <string>
  13.  
  14. using namespace std;
  15.  
  16. ifstream fin("dsu.in");
  17. ofstream fout("dsu.out");
  18. int n;
  19.  
  20. struct set{
  21.     int max;
  22.     int min;
  23.     int size;
  24.     bool is_actual=true;
  25.     int actual;
  26. };
  27.  
  28. int prin[100];
  29. set* unions[100];
  30.  
  31. void combine(int num1, int num2){
  32.     if(num1>num2)
  33.         swap(num1,num2);
  34.     if(unions[num2]->is_actual && unions[num1]->is_actual){
  35.         if(num1==num2)return;
  36.         unions[num1]->max = unions[num2]->max;
  37.         unions[num1]->size += unions[num2]->size;
  38.         unions[num2]->is_actual=false;
  39.         unions[num2]->actual=num1;
  40.         return;
  41.         }
  42.     else if(unions[num1]->is_actual && !(unions[num2]->is_actual))
  43.         combine(num1, unions[num2]->actual);
  44.         else if(!(unions[num1]->is_actual) && unions[num2]->is_actual)
  45.                 combine(unions[num1]->actual,num2);
  46.             else
  47.                 combine(unions[num1]->actual,unions[num2]->actual);
  48. }
  49.  
  50. void get(int num1){
  51.     if(unions[num1]->is_actual)
  52.         cout<<unions[num1]->min<<" "<<unions[num1]->max<<" "<<unions[num1]->size<<endl;
  53.     else
  54.         get(unions[num1]->actual);
  55. }
  56.  
  57. int main(){
  58.     int num1, num2;
  59.     cin>>n;
  60.     string command;
  61.     for(int i=0; i<n; i++){
  62.         unions[i]=new set;
  63.         unions[i]->min=i+1;
  64.         unions[i]->max=i+1;
  65.         unions[i]->size=1;
  66.     }
  67.     while(cin>>command){
  68.         switch(command[0]){
  69.             case 'u':{
  70.                 cin>>num1>>num2;
  71.                 combine(num1-1, num2-1);
  72.             }break;
  73.             case 'g':{
  74.                 cin>>num1;
  75.                 get(num1-1);
  76.             }break;
  77.         }
  78.     }
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment