Advertisement
Guest User

exodus

a guest
Feb 6th, 2016
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.70 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. bool Valid(int * pointers, bool *GlobalExclude, bool *excludeR, bool *excludeG, vector<int> *recieve, vector<int> *give, int pos){
  7.  
  8. if(excludeR[pointers[pos]] == true || excludeG[pointers[pos]] == true || GlobalExclude[pointers[pos]] == true)
  9. return false;
  10.  
  11. for(int i = 0; i < give[pointers[pos]].size(); i++){
  12. if(excludeG[give[pointers[pos]].at(i)] == true)
  13. return false;
  14. }
  15.  
  16. for(int i = 0; i < recieve[pointers[pos]].size(); i++){
  17. if(excludeR[recieve[pointers[pos]].at(i)] == true)
  18. return false;
  19. }
  20.  
  21. return true;
  22. }
  23.  
  24. void Exclude (int *pointers, bool *GlobalExclude, bool *excludeR, bool *excludeG, vector<int> *recieve, vector<int> *give, int pos){
  25.  
  26. GlobalExclude[pos] = true;
  27.  
  28. for(int i = 0; i < recieve[pos].size(); i++){
  29. excludeG[pointers[recieve[pos].at(i)]] = true;
  30. //cout << "excluding G " << pointers[recieve[pos].at(i)] << endl;
  31. }
  32. for(int i = 0; i < give[pos].size(); i++){
  33. excludeR[pointers[give[pos].at(i)]] = true;
  34. //cout << "excluding R " << pointers[give[pos].at(i)] << endl;
  35. }
  36. }
  37.  
  38. int main(){
  39. int t, n, m;
  40. int temp1, temp2;
  41. int assigned, hero;
  42. cin >> t;
  43. while(t--){
  44. assigned = 0;
  45.  
  46. cin >> n >> m;
  47.  
  48. char *heroes = new char[n+1];
  49. vector<int>* recieve = new vector<int>[n+1];
  50. vector<int>* give = new vector<int>[n+1];
  51.  
  52. bool *excludeR = new bool[n+1];
  53. bool *excludeG = new bool[n+1];
  54. bool *GlobalExclude = new bool [n+1];
  55.  
  56. int *pointers = new int [n+1]; //so pointery pointers that intigers, trust me it works that way, If they would be more pointy they would be floating point numbers
  57.  
  58. for(int i = 1; i <= n; i++){
  59. GlobalExclude[i] = false;
  60. pointers[i] = i;
  61. }
  62.  
  63. for(int i = 0; i < m; i++){
  64. cin >> temp1 >> temp2;
  65. recieve[temp1].push_back(temp2);
  66. give[temp2].push_back(temp1);
  67. }
  68.  
  69. /*for(int i = 1; i <= n; i++){
  70. for(int j = 0; j < recieve[i].size(); j++){
  71. cout << recieve[i].at(j) << " ";
  72. }
  73. cout << endl;
  74. }*/
  75.  
  76. for(char j = 1; j < 8 && assigned < n; j++){ // petla dla kazdego bohatera
  77. //cout << "hero " << j << endl;
  78. hero = 0;
  79. for(char k = 1; k <=n; k++){
  80. excludeG[k] = false;
  81. excludeR[k] = false;
  82. }
  83. for(int i = j; i <= n; i++){ // petla dla kazdej tozsamosci
  84.  
  85. //cout << "identity " << i << endl;
  86.  
  87. if(Valid(pointers, GlobalExclude, excludeR, excludeG, recieve, give, i)){
  88. heroes[i] = j;
  89. Exclude(pointers, GlobalExclude, excludeR, excludeG, recieve, give, i);
  90.  
  91. /*cout << "excluded ";
  92. for(int exc = 1; exc <= n; exc++){
  93. if(excludeG[exc] || excludeR[exc] || GlobalExclude[exc])
  94. cout << exc << ' ';
  95. }
  96. cout << endl;*/
  97.  
  98. assigned++;
  99.  
  100. if(hero){
  101. recieve[hero].insert( recieve[hero].end(), recieve[i].begin(), recieve[i].end() );
  102. give[hero].insert( give[hero].end(), recieve[i].begin(), recieve[i].end() );
  103. pointers[i] = hero;
  104.  
  105. if(recieve[i].empty())
  106. recieve[i].~vector<int>();
  107. if(give[i].empty())
  108. give[i].~vector<int>();
  109.  
  110. /*cout << "pointers ";
  111. for(int whatever = 1; whatever <= n; whatever++)
  112. cout << pointers[whatever] << ' ';
  113. cout << endl;*/
  114. }
  115. else{
  116. hero = i;
  117. }
  118.  
  119. }
  120. }
  121. }
  122.  
  123. for(int i = 1; i <= n; i++){
  124. cout << int(heroes[i]) << ' ';
  125. }
  126. cout << endl;
  127.  
  128. delete[] heroes;
  129. delete[] recieve;
  130. delete[] give;
  131.  
  132. delete[] GlobalExclude;
  133. delete[] excludeR;
  134. delete[] excludeG;
  135.  
  136. delete[] pointers;
  137. }
  138. }
  139.  
  140. /*
  141. Załozenie jes takie, że przydzielam pierwszemu superbohaterowi pierwszą rożsamosć (i tak ktoś musi ją mieć) a następnie przydzielam mu takie tożsamości które spełniają warunki:
  142. n-ta tożsamość
  143. 1) nie poznaje tożsamości przydzielonych dla bohatera 1
  144. 2) tożsamości bohatera 1 nie poznają n-tej tożsamości
  145. 3) tozsamości bohatera nie poznają tożsamości które poznają n-tą tożsamość
  146. 4) tożsamoś nie poznaje tożsamości które poznają którąś z tożsamości bohatera
  147.  
  148. mam za tam liste wszystkich tożsamości i 3 listy wykluczeń
  149. excludeR wskazuje na tożsamości które otrzymują informacje o jednej z tozsamości bohatera
  150. excludeG wskazuje na tozsamości które o których informache ma bohater
  151. GlobalExclude zawiera tożsamosci które są już przypisane do któregos z bohaterów
  152.  
  153. jako że tożsamości nie są przydzielane pokolei mam tablice heroes która każdej tożsamości przypisuje bohatera który ją posiada
  154. heroes[n+1]
  155.  
  156. są dwie tablice wektorów
  157. recieve[n+1] która każdej z tożsamości przypisuje tożsamości od których odrzymuje dane
  158. give[n+1] która każdej tożsamości przypisuje tożsamości którym przekazuje swoje dane
  159.  
  160. int assigned zapamiętuje ile tożsamości było już przydzielonych żeby zakończyć pracę programu jak wszystkie zostana przydzielone
  161.  
  162. int pointers[n+1] unifikuje wszystkie tożesamości bohatera, pierwsza tożsamosć jaką dostaje bohater staje sie dominująca i wszyskie relacje pozostałych tożsamosci są
  163. przerzucone do dominującej, a przy sprawdzaniu poprawności pola i zaznaczaniu zakazanych pól młodsze tożsamości bohatera (te które zostały później dodane) są maskowan główną tożsamością
  164.  
  165. funkcja Valid sprawdza czy dana tożsamość może być przydzielona do danego bohatera
  166.  
  167. funkcja Exclude wyklucza tożsamości ktore nie mogę być przydzielone danemu bohaterowi
  168.  
  169.  
  170.  
  171. proste sprawdzenia:
  172. 5
  173. 3 2
  174. 1 2
  175. 1 3
  176. 5 5
  177. 1 2
  178. 2 3
  179. 3 4
  180. 4 5
  181. 5 1
  182. 7 10
  183. 1 2
  184. 2 3
  185. 1 4
  186. 2 4
  187. 3 4
  188. 4 5
  189. 4 6
  190. 4 7
  191. 5 6
  192. 6 7
  193. 9 9
  194. 1 2
  195. 2 3
  196. 3 4
  197. 4 5
  198. 5 6
  199. 6 7
  200. 7 8
  201. 8 9
  202. 9 1
  203. 4 2
  204. 2 3
  205. 4 1
  206.  
  207.  
  208. odpowiedzi
  209. 1 2 2
  210. 1 2 3 4 5
  211. 1 2 3 4 5 6 7
  212. 1 2 3 1 2 3 1 2 3
  213. 1 1 2 3
  214.  
  215. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement