Advertisement
paranid5

Parents

Jun 29th, 2020
459
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.17 KB | None | 0 0
  1. /*Родословная
  2. В генеалогическом древе у каждого человека, кроме родоначальника, есть ровно один родитель.
  3.  
  4. Каждом элементу дерева сопоставляется целое неотрицательное число, называемое высотой. У родоначальника высота равна 0, у любого другого элемента высота на 1 больше, чем у его родителя.
  5.  
  6. Вам дано генеалогическое древо, определите высоту всех его элементов.
  7.  
  8. Входные данные
  9.  
  10. Программа получает на вход число элементов в генеалогическом древе N. Далее следует N−1 строка, задающие родителя для каждого элемента древа, кроме родоначальника. Каждая строка имеет вид имяпотомка имяродителя.
  11.  
  12. Выходные данные
  13.  
  14. Программа должна вывести список всех элементов древа в лексикографическом порядке. После вывода имени каждого элемента необходимо вывести его высоту.
  15.  
  16. Примечание
  17.  
  18. Эта задача имеет решение сложности O(n), но вам достаточно написать решение сложности O(n2) (не считая сложности обращения к элементам словаря или ассоциативного массива).
  19.  
  20.  
  21. Примеры
  22. Ввод
  23. Вывод
  24. 9
  25. Alexei Peter_I
  26. Anna Peter_I
  27. Elizabeth Peter_I
  28. Peter_II Alexei
  29. Peter_III Anna
  30. Paul_I Peter_III
  31. Alexander_I Paul_I
  32. Nicholaus_I Paul_I
  33.  
  34.  
  35. Alexander_I 4
  36. Alexei 1
  37. Anna 1
  38. Elizabeth 1
  39. Nicholaus_I 4
  40. Paul_I 3
  41. Peter_I 0
  42. Peter_II 2
  43. Peter_III 2*/
  44.  
  45.  
  46. #include <iostream>
  47. #include <map>
  48. #include <string>
  49. #include <queue>
  50.  
  51. int main()
  52. {
  53.     int n = 0;
  54.     std::scanf("%d", &n);
  55.     std::map<std::string, std::string> family; // сын/отец
  56.     std::map<std::string, int> final; // итог
  57.     std::queue<std::string> pred; // родители
  58.     for (int i = 0; i < n - 1; i++)
  59.     {
  60.         std::string child;
  61.         std::string father;
  62.         std::cin >> child;
  63.         std::cin >> father;
  64.         final[child] = 0;
  65.         final[father] = 0;
  66.         family[child] = father;
  67.         family[father];
  68.     }
  69.     for (auto& it : family)
  70.     {
  71.         if (it.second.empty())
  72.         {
  73.             final[it.first] = 0;
  74.             pred.push(it.first);
  75.             family.erase(it.first);
  76.             break;
  77.         }
  78.     } // нашли родоначальника
  79.     while (!pred.empty())
  80.     {
  81.         std::queue<std::string> del; // удаление потомков из family
  82.         for (auto& it : family)
  83.         {
  84.             if (it.second == pred.front())
  85.             {
  86.                 final[it.first] = final[pred.front()] + 1;
  87.                 pred.push(it.first);
  88.                 del.push(it.first);
  89.             }
  90.         }
  91.         while(!del.empty())
  92.         {
  93.             family.erase(del.front());
  94.             del.pop();
  95.         }
  96.         pred.pop();
  97.     }
  98.     for (auto& it : final)
  99.         std::printf("%s %d\n", it.first.c_str(), it.second);
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement