Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include "train.h"
  2. #include <vector>
  3. #include <cstring>
  4. #include <queue>
  5.  
  6. #define PB push_back
  7.  
  8. using namespace std;
  9.  
  10. typedef vector < int > vi;
  11.  
  12. const int N = 5055;
  13.  
  14. int spas[N]; /// HDZ
  15. int smrt[N]; /// SDP
  16. int n;
  17.  
  18. vi v[N], r[N];
  19. int cnt[N], izb[N];
  20. queue < int > Q;
  21.  
  22. vi who_wins(vi a, vi rr, vi uu, vi vv) {
  23.     n = a.size();
  24.     for(int i  = 0;i < (int)vv.size();i++){
  25.         v[uu[i]].PB(vv[i]);
  26.         r[vv[i]].PB(uu[i]);
  27.     }
  28.     int kol = 0;
  29.     for(;;kol++){
  30.         memset(spas, 0, sizeof(spas));
  31.         memset(smrt, 0, sizeof(smrt));
  32.         memset(cnt, 0, sizeof(cnt));
  33.  
  34.         for(int i = 0;i < n;i++){
  35.             if(izb[i]) continue;
  36.             if(rr[i] == 1) smrt[i] = 1, Q.push(i);
  37.             else if(a[i] == 1) cnt[i] = 1;
  38.             else {
  39.                 cnt[i] = 0;
  40.                 for(int x : v[i])
  41.                     cnt[i] += !izb[x];
  42.             }
  43.         }
  44.         for(;!Q.empty();Q.pop()){
  45.             int cur = Q.front();
  46.             for(int x : r[cur]){
  47.                 if(izb[x]) continue;
  48.                 cnt[x]--;
  49.                 if(cnt[x] == 0 && !smrt[x]){
  50.                     smrt[x] = 1;
  51.                     Q.push(x);
  52.                 }
  53.             }
  54.         }
  55.         for(int i = 0;i < n;i++){
  56.             if(izb[i]) continue;
  57.             if(smrt[i] == 0) spas[i] = 1, Q.push(i), cnt[i] = 0;
  58.             else if(a[i] == 0) cnt[i] = 1;
  59.             else {
  60.                 cnt[i] = 0;
  61.                 for(int x : v[i])
  62.                     cnt[i] += !izb[x];
  63.             }
  64.         }
  65.         for(;!Q.empty();Q.pop()){
  66.             int cur = Q.front();
  67.             for(int x : r[cur]){
  68.                 if(izb[x]) continue;
  69.                 cnt[x]--;
  70.                 if(cnt[x] == 0 && !spas[x]){
  71.                     spas[x] = 1;
  72.                     Q.push(x);
  73.                 }
  74.             }
  75.         }
  76.         int cc = 0;
  77.         for(int i = 0;i < n;i++)
  78.             if(spas[i] && !izb[i]) cc++, izb[i] = 1;
  79.         if(cc == 0) break;
  80.     }
  81.     vi sol;
  82.  
  83.     for(int i = 0;i < n;i++)
  84.         sol.PB(!izb[i]);
  85.     return sol;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement