码迷,mamicode.com
首页 > 其他好文 > 详细

CodeForces 909E Coprocessor

时间:2018-01-03 21:01:54      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:$1   图片   拓扑排序   its   code   while   pre   process   mes   

技术分享图片

题解。

贪心,拓扑排序。

和拓扑排序一样,先把$flag$为$0$的点能删的都删光,露出来的肯定都是$flag$为$0$的,然后疯狂删$flag$为$0$的,这些会使答案加$1$,反复操作就可以了。

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;
int n, m;
int f[maxn], in[maxn];

int h[maxn], to[maxn], nx[maxn];

void add(int id, int u, int v) {
  to[id] = v;
  nx[id] = h[u];
  h[u] = id;
  in[v] ++;
}

int main() {
  scanf("%d%d", &n, &m);
  for(int i = 0; i < n; i ++) {
    h[i] = -1;
    scanf("%d", &f[i]);
  }
  for(int i = 0; i < m; i ++) {
    int u, v;
    scanf("%d%d", &u, &v);
    add(i, v, u);
  }
  queue<int> Q[2];
  for(int i = 0; i < n; i ++) {
    if(in[i] == 0) {
      Q[f[i]].push(i);
    }
  }
  int cnt = 0;
  int ans = 0;
  while(cnt != n) {
    if(!Q[0].empty()) {
      while(!Q[0].empty()) {
        int x = Q[0].front();
        cnt ++;
        Q[0].pop();
        for(int i = h[x]; i != -1; i = nx[i]) {
          in[to[i]] --;
          if(in[to[i]] == 0) {
            Q[f[to[i]]].push(to[i]);
          }
        }
      }
    } else {
      ans ++;
      while(!Q[1].empty()) {
        int x = Q[1].front();
        cnt ++;
        Q[1].pop();
        for(int i = h[x]; i != -1; i = nx[i]) {
          in[to[i]] --;
          if(in[to[i]] == 0) {
            Q[f[to[i]]].push(to[i]);
          }
        }
      }
    }
  }
  printf("%d\n", ans);
  return 0;
}

 

CodeForces 909E Coprocessor

标签:$1   图片   拓扑排序   its   code   while   pre   process   mes   

原文地址:https://www.cnblogs.com/zufezzt/p/8185316.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!