Advertisement
Guest User

Untitled

a guest
Feb 24th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.99 KB | None | 0 0
  1. #if 1
  2. #define _CRT_SECURE_NO_WARNINGS
  3.  
  4. #include <iostream>
  5. #include <string>
  6. #include <vector>
  7. #include <list>
  8. #include <map>
  9. #include <unordered_map>
  10. #include <set>
  11. #include <unordered_set>
  12. #include <queue>
  13. #include <deque>
  14. #include <bitset>
  15. #include <algorithm>
  16. #include <cmath>
  17.  
  18.  
  19. typedef long long ll;
  20. typedef unsigned long long ull;
  21. #define ff first
  22. #define ss second
  23. using namespace std;
  24.  
  25.  
  26. const ull hashConst = 111;
  27.  
  28. const ull ullMax = 18446744073709551615UL;
  29.  
  30. class Project{
  31. public:
  32. string name;
  33. ull version;
  34. Project(){
  35. this->name = "";
  36. this->version = -1;
  37. }
  38.  
  39. Project (string& name, ull vers){
  40. this->name = name;
  41. this->version = vers;
  42. subs = vector<Project*>(0);
  43. }
  44.  
  45. vector<Project*> subs;
  46. void addSub(Project* sub){
  47. subs.push_back(sub);
  48. }
  49.  
  50. bool operator ==(const Project& other){
  51. return this->name == other.name && this->version == other.version;
  52. }
  53. };
  54.  
  55.  
  56. int main() {
  57. ull projectsCount;
  58. cin >> projectsCount;
  59.  
  60. unordered_map<string, unordered_map<ull, Project*>> projects_by_versions;
  61. Project* ptr_pproj;
  62.  
  63. for (ull i = 0; i < projectsCount; i++){
  64. string pname;
  65. ull pvers;
  66. cin >> pname >> pvers;
  67. Project * ptr_proj = projects_by_versions[pname][pvers];
  68. if ( ptr_proj == NULL){
  69. ptr_proj = new Project(pname, pvers);
  70. projects_by_versions[pname][pvers] = ptr_proj;
  71. }
  72. ull subCount;
  73. cin >> subCount;
  74. for (ull j = 0; j < subCount; j++){
  75. string sname;
  76. ull svers;
  77. cin >> sname >> svers;
  78. Project * ptr_sub = projects_by_versions[sname][svers];
  79. if (ptr_sub == NULL){
  80. ptr_sub= new Project(sname, svers);
  81. projects_by_versions[sname][svers] = ptr_sub;
  82. }
  83. ptr_proj->addSub(ptr_sub);
  84. }
  85. if(i == 0){
  86. ptr_pproj = ptr_proj;
  87. }
  88. }
  89.  
  90. map <string, pair<ull, ull>* > psubs;
  91.  
  92. queue<Project*> q;
  93. unordered_map<Project*, bool> isEntered;
  94. q.push(ptr_pproj);
  95. ull dist = 1;
  96. while(q.size() ){
  97. Project* curv = q.front();
  98. q.pop();
  99. for (Project* sub : curv->subs){
  100. if (!isEntered[sub]){
  101. q.push(sub);
  102. pair<ull, ull> * psub = psubs[sub->name];
  103. if ( (psub == NULL) ){
  104. psub = new pair<ull, ull>(dist, sub->version);
  105. psubs[sub->name] = psub;
  106. }
  107. else if (psub->first > dist ||
  108. (psub->first == dist && psub->second > sub->version )){
  109. psubs[sub->name] = psub;
  110. }
  111. }
  112. }
  113. isEntered[curv] = true;
  114. dist++;
  115. }
  116.  
  117. for (auto s : psubs){
  118. cout << s.first << " " << s.second->second << endl;
  119. }
  120.  
  121. return 0;
  122. }
  123.  
  124. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement