Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <string>
- #include <cmath>
- #include <cstring>
- #include <vector>
- using namespace std;
- const int N = 600000;
- vector<int> g[N];
- int prevs[N];
- int room[N];
- int qh[2], qt[2], q[2][N];
- inline void push(int id, int value) {
- q[id][qt[id]++] = value;
- }
- inline bool empty(int id) {
- return qh[id] == qt[id];
- }
- inline int pop(int id) {
- return q[id][qh[id]++];
- }
- int solve(int n, int m, int cur) {
- fill(prevs, prevs + n, 0);
- for (int i = 0; i < n; ++i) {
- for (int j = 0; j < g[i].size(); ++j) {
- ++prevs[g[i][j]];
- }
- }
- qh[0] = qt[0] = qh[1] = qt[1] = 0;
- for (int i = 0; i < n; ++i) {
- if (prevs[i] == 0) {
- push(room[i], i);
- }
- }
- int taken = 0;
- int ans = 0;
- while (true) {
- while (!empty(cur)) {
- int u = pop(cur);
- ++taken;
- for (int i = 0; i < g[u].size(); ++i) {
- int v = g[u][i];
- if (--prevs[v] == 0) {
- push(room[v], v);
- }
- }
- }
- if (taken == n) {
- break;
- }
- cur = 1 - cur;
- ++ans;
- }
- return ans;
- }
- int main() {
- //freopen("in.txt", "r", stdin);
- int t;
- scanf("%d", &t);
- for (int i = 0; i < t; ++i) {
- int n, m;
- scanf("%d %d", &n, &m);
- for (int j = 0; j < n; ++j) {
- g[j].resize(0);
- }
- for (int j = 0; j < n; ++j) {
- scanf("%d", &room[j]);
- --room[j];
- }
- for (int j = 0, u, v; j < m; ++j) {
- scanf("%d %d", &u, &v);
- --u, --v;
- g[u].push_back(v);
- }
- printf("%d\n", min(solve(n, m, 0), solve(n, m, 1)));
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment