Codeforces 909E. Coprocessor (拓扑、模拟)
题目链接: Coprocessor
题意:
给出n个待处理的事件(0 - n-1),再给出了n个标(0表示只能在主处理器中处理这个事件,1表示只能在副处理器中处理这个事件),处理器每次能处理多个任务。每个事件有关联,如果一个任务要在副处理器上执行,那它所依赖的任务要么已执行完了,要么和它一起在这个副处理器上同时执行。问副处理器最少调用多少次。
题解:
首先拓扑排序是肯定要的,先处理出入度为0的点,处理的时候先处理所有入度为0且标为0(只能在主处理器上处理)的点,这样保证每处理一次就把能在副处理器上处理的点全都处理了出来。在处理的过程中保存处理出来的入度为0的点,这样就不用暴力找点了。
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1e5+;
int res[MAX_N];
vector<int> vec[MAX_N];
int in[MAX_N];
queue<int> que1,que2;
int main()
{
int N,M,T;
while(cin>>N>>M)
{
memset(res,,sizeof(res));
memset(in,,sizeof(in));
while(!que1.empty()) que1.pop();
while(!que2.empty()) que2.pop();
for(int i=;i<MAX_N;i++) vec[i].clear();
for(int i=;i<N;i++)
{
scanf("%d",&res[i]);
}
for(int i=;i<M;i++)
{
int a,b;
scanf("%d%d",&a,&b);
vec[b].push_back(a);
in[a] ++;
}
for(int i=;i<N;i++)
{
if(in[i] == )
{
if(res[i] == ) que1.push(i);
else if(res[i] == ) que2.push(i);
} }
int ans = ;
int cnt = N;
while(cnt > )
{
while(!que1.empty())
{ int t = que1.front();que1.pop();
cnt --;
for(int i=;i<vec[t].size();i++)
{
in[vec[t][i]]--;
if(in[vec[t][i]] == )
{
if(res[vec[t][i]] == ) que2.push(vec[t][i]);
else que1.push(vec[t][i]);
}
}
}
if(!que2.empty()) ans ++;
while(!que2.empty())
{
int t = que2.front();que2.pop();
cnt --;
for(int i=;i<vec[t].size();i++)
{
in[vec[t][i]]--;
if(in[vec[t][i]] == )
{
if(res[vec[t][i]] == ) que2.push(vec[t][i]);
else que1.push(vec[t][i]);
}
}
}
}
cout<<ans<<endl;
}
return ;
}
Codeforces 909E. Coprocessor (拓扑、模拟)的更多相关文章
- CodeForces 909E Coprocessor(无脑拓扑排序)
You are given a program you want to execute as a set of tasks organized in a dependency graph. The d ...
- Codeforces 909E(Coprocessor,双队列维护)
题意:给出n个待处理的事件(0 ~n-1),再给出了n个标(0表示只能在主处理器中处理这个事件,1表示只能在副处理器中处理这个事件),处理器每次能处理多个任务.每个事件有关联,如果一个任务要在副处理器 ...
- CodeForces 909E Coprocessor
题解. 贪心,拓扑排序. 和拓扑排序一样,先把$flag$为$0$的点能删的都删光,露出来的肯定都是$flag$为$0$的,然后疯狂删$flag$为$0$的,这些会使答案加$1$,反复操作就可以了. ...
- Codeforces Round #455 (Div. 2) 909E. Coprocessor
题 OvO http://codeforces.com/contest/909/problem/E CF455 div2 E CF 909E 解 类似于拓扑排序地进行贪心, 对于 Ei=0 并且入度为 ...
- Codeforces 738D. Sea Battle 模拟
D. Sea Battle time limit per test: 1 second memory limit per test :256 megabytes input: standard inp ...
- Codeforces 626A Robot Sequence(模拟)
A. Robot Sequence time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...
- CodeForces - 589D(暴力+模拟)
题目链接:http://codeforces.com/problemset/problem/589/D 题目大意:给出n个人行走的开始时刻,开始时间和结束时间,求每个人分别能跟多少人相遇打招呼(每两人 ...
- Codeforces 767B. The Queue 模拟题
B. The Queue time limit per test:1 second memory limit per test:256 megabytes input:standard input o ...
- Codeforces 510C (拓扑排序)
原题:http://codeforces.com/problemset/problem/510/C C. Fox And Names time limit per test:2 seconds mem ...
随机推荐
- 设计多选按钮ListChooseView
设计多选按钮ListChooseView 答应某位女屌丝而写的控件,效果还不错,开源给大家^_^! 效果图: 源码: // // ListChooseView.h // ScrollChooseBut ...
- 心灵鸡汤[all]
1. [iPhone 有哪些非常有必要下载的 App] 2. 相 信 自 己 3. 英语四级作文模板 4. 比尔盖茨的人生忠告 5. 李嘉诚 <Are you ready> 6. 李嘉诚语 ...
- Python学习---IO的异步[tornado模块]
tornado是一个异步非阻塞的WEB框架.它的异步非阻塞实际上就是用事件循环写的. 主要体现在2点: 1. 作为webserver可以接收请求,同时支持异步处理请求.Django只能处理完成上一个请 ...
- windows下npm安装vue
一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...
- Coursera-AndrewNg(吴恩达)机器学习笔记——第二周编程作业(线性回归)
一.准备工作 从网站上将编程作业要求下载解压后,在Octave中使用cd命令将搜索目录移动到编程作业所在目录,然后使用ls命令检查是否移动正确.如: 提交作业:提交时候需要使用自己的登录邮箱和提交令牌 ...
- 阿里云MaxCompute被Forrester评为全球云端数据仓库领导者
参考消息网3月19日报道 日前,全球权威调研机构佛瑞斯特研究公司(Forrester)发布<2018年一季度云端数据仓库>报告.报告对大数据服务商的主要功能.区域表现.细分市场和典型客户等 ...
- JAVA入门之程序设计环境搭建
这篇文章写给刚接触或者想学JAVA的新朋友.学习JAVA,需要找一本好的入门书籍,推荐<Java从入门到精通>,然后就是JAVA程序设计开发环境的搭建. 首先,我们需要安装JAVA开发工具 ...
- 发现微信支付bug
第一张银行卡支付金额不足无法付款,选择另一张同样密码的银行卡,居然不用重新输入密码即可直接付款成功!
- iptables简单规则记录
先来一句:好记性不如烂笔头! 1.iptables简介 iptables是基于包过滤的防火墙,它主要工作在osi模型的2,,4层,也可以工作在7层(iptables + squid) 2.原理 防火墙 ...
- print(函数.__closure__) 来判断是不是闭包, 返回cell , 是闭包, 返回None 则不是闭包
print(函数.__closure__) 来判断是不是闭包, 返回cell , 是闭包, None 则不是闭包