Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.44 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct struk
  6. {
  7. int cvor;
  8. int k;
  9. };
  10.  
  11. inline bool operator <(const struk& a, const struk& b)
  12. {
  13. return a.k < b.k;
  14. }
  15.  
  16. multiset<struk> kraj;
  17.  
  18. int dani[100010];
  19. int refresh[100010];
  20. int otac[100010];
  21. vector<int> graf[100010];
  22. int qu[100010];
  23. int brVeza[100010];
  24. int q = 0;
  25. vector<int> resenje;
  26.  
  27. void bfs(int x)
  28. {
  29. qu[q++] = x;
  30. refresh[x] = dani[x];
  31. for(int i=0; i < q;i++)
  32. {
  33. int cvor = qu[i];
  34. for(int j = 0; j < graf[cvor].size(); j++)
  35. {
  36. int dodatiCvor = graf[cvor][j];
  37. qu[q++] = dodatiCvor;
  38. if(refresh[otac[dodatiCvor]] - 1 < dani[dodatiCvor])
  39. refresh[dodatiCvor] = refresh[otac[dodatiCvor]] - 1;
  40. else
  41. refresh[dodatiCvor] = dani[dodatiCvor];
  42. }
  43. }
  44. }
  45.  
  46. int main()
  47. {
  48. ios_base::sync_with_stdio(false);
  49. cin.tie(NULL);
  50.  
  51. int n;
  52. cin >> n;
  53. for(int i = 1; i <= n; i++) cin >> dani[i];
  54. for(int i = 0; i < n - 1; i++)
  55. {
  56. int p,q;
  57. cin >> p >> q;
  58. graf[p].push_back(q);
  59. otac[q] = p;
  60. brVeza[p]++;
  61. }
  62. int glava = 1;
  63. while(otac[glava] != 0) glava = otac[glava];
  64. bfs(glava);
  65. //for(int i = 1; i <= n; i++) cout << i << ":" << refresh[i] << "\n";
  66. for(int i=1; i <=n; i++)
  67. {
  68. if(brVeza[i]==0)
  69. {
  70. struk pom;
  71. pom.k = refresh[i];
  72. pom.cvor = i;
  73. kraj.insert(pom);
  74. }
  75. }
  76. int br = 1;
  77. //for(int i=1;i<=n;i++) cout << refresh[i] << " ";
  78. while(true)
  79. {
  80. //for(int i=1;i<=n;i++) cout << brVeza[i] << " ";
  81. //cout << br << endl;
  82. if(kraj.size()==0) break;
  83. struk prvi = *kraj.begin();
  84. //cout << prvi.k << " " << prvi.cvor << endl;
  85. if(prvi.k - br < 0) {cout << "Pobedila je crna magija"; return 0;}
  86. resenje.push_back(prvi.cvor);
  87. brVeza[otac[prvi.cvor]]--;
  88. struk cvorZaBrisanje = prvi;
  89. kraj.erase(kraj.begin());
  90. if(brVeza[otac[cvorZaBrisanje.cvor]] == 0)
  91. {
  92. int noviCvor = otac[cvorZaBrisanje.cvor];
  93. struk pom;
  94. pom.k = refresh[noviCvor];
  95. pom.cvor = noviCvor;
  96. kraj.insert(pom);
  97. }
  98.  
  99. br++;
  100. }
  101. for(int i = 0; i < resenje.size();i++) cout << resenje[i] << " ";
  102.  
  103. return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement