Guest User

Untitled

a guest
Jun 18th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.95 KB | None | 0 0
  1. #include <fstream>
  2. #include <cstring>
  3. #include <cmath>
  4. using std::strcmp;
  5. using std::ifstream;
  6. using std::ofstream;
  7. using std::min;
  8.  
  9. struct List {
  10. int value;
  11. int min_item;
  12. int size;
  13. List * parent;
  14. };
  15.  
  16. class DSU {
  17. private:
  18. List * items;
  19. int itemNum;
  20. List& getParent(List &item);
  21. public:
  22. DSU (int N) {
  23. items = new List[N];
  24. for (int i=0; i<N; i++) {
  25. items[i].parent = &items[i];
  26. items[i].value = i+1;
  27. items[i].size = 1;
  28. items[i].min_item = items[i].value;
  29. }
  30. itemNum = N;
  31. }
  32. void merge(int first, int second);
  33. int get(int item);
  34. };
  35.  
  36. List& DSU::getParent(List &item) {
  37. if (item.parent == &item) {
  38. return item;
  39. }
  40. item.parent = &getParent(*item.parent);
  41. return *item.parent;
  42. }
  43.  
  44. void DSU::merge(int first, int second) {
  45. List &firstItem = getParent(items[first]);
  46. List &secondItem = getParent(items[second]);
  47. if (firstItem.value == secondItem.value)
  48. return;
  49. if (&firstItem.size <= &secondItem.size) {
  50. firstItem.parent = &secondItem;
  51. secondItem.min_item = min(firstItem.min_item, secondItem.min_item);
  52. secondItem.size += firstItem.size;
  53. } else {
  54. secondItem.parent = &firstItem;
  55. firstItem.min_item = min(firstItem.min_item, secondItem.min_item);
  56. firstItem.size += secondItem.size;
  57. }
  58. }
  59.  
  60. int DSU::get(int item) {
  61. return getParent(items[item]).min_item;
  62. }
  63.  
  64. int main() {
  65. ifstream input("dsu.in", std::ios::in);
  66. ofstream output("dsu.out", std::ios::out);
  67. int N;
  68. input >> N;
  69. DSU dsu(N);
  70. while (!input.eof()) {
  71. char * cmd = new char[255];
  72. input >> cmd;
  73.  
  74. if (strcmp(cmd, "union")==0) {
  75. int first, second;
  76. input >> first >> second;
  77. dsu.merge(first-1, second-1);
  78. }
  79.  
  80. if (strcmp(cmd, "get")==0) {
  81. int item;
  82. input >> item;
  83. output << dsu.get(item-1) << std::endl;
  84. }
  85.  
  86. delete cmd;
  87. }
  88.  
  89. input.close();
  90. output.close();
  91. return 0;
  92. }
Add Comment
Please, Sign In to add comment