Guest User

J

a guest
Nov 25th, 2012
296
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.48 KB | None | 0 0
  1. #include <cstdio>
  2. #include <string>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. const int N = 600000;
  10.  
  11. vector<int> g[N];
  12. int prevs[N];
  13. int room[N];
  14.  
  15. int qh[2], qt[2], q[2][N];
  16.  
  17. inline void push(int id, int value) {
  18.     q[id][qt[id]++] = value;
  19. }
  20.  
  21. inline bool empty(int id) {
  22.     return qh[id] == qt[id];
  23. }
  24.  
  25. inline int pop(int id) {
  26.     return q[id][qh[id]++];
  27. }
  28.  
  29. int solve(int n, int m, int cur) {
  30.     fill(prevs, prevs + n, 0);
  31.  
  32.     for (int i = 0; i < n; ++i) {
  33.         for (int j = 0; j < g[i].size(); ++j) {
  34.             ++prevs[g[i][j]];
  35.         }
  36.     }
  37.  
  38.     qh[0] = qt[0] = qh[1] = qt[1] = 0;
  39.     for (int i = 0; i < n; ++i) {
  40.         if (prevs[i] == 0) {
  41.             push(room[i], i);          
  42.         }
  43.     }
  44.     int taken = 0;
  45.     int ans = 0;
  46.     while (true) {
  47.         while (!empty(cur)) {
  48.             int u = pop(cur);
  49.             ++taken;
  50.             for (int i = 0; i < g[u].size(); ++i) {
  51.                 int v = g[u][i];
  52.                 if (--prevs[v] == 0) {
  53.                     push(room[v], v);
  54.                 }
  55.             }
  56.         }
  57.         if (taken == n) {
  58.             break;
  59.         }
  60.         cur = 1 - cur;
  61.         ++ans;
  62.     }
  63.     return ans;
  64. }
  65.  
  66. int main() {
  67.     //freopen("in.txt", "r", stdin);
  68.     int t;
  69.     scanf("%d", &t);
  70.     for (int i = 0; i < t; ++i) {
  71.         int n, m;
  72.         scanf("%d %d", &n, &m);
  73.         for (int j = 0; j < n; ++j) {
  74.             g[j].resize(0);
  75.         }
  76.         for (int j = 0; j < n; ++j) {
  77.             scanf("%d", &room[j]);
  78.             --room[j];
  79.         }
  80.         for (int j = 0, u, v; j < m; ++j) {
  81.             scanf("%d %d", &u, &v);
  82.             --u, --v;
  83.             g[u].push_back(v);
  84.         }
  85.         printf("%d\n", min(solve(n, m, 0), solve(n, m, 1)));
  86.     }
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment