Codeforces 645D Robot Rapping Results Report【拓扑排序+二分】
2024-08-31 07:17:24
题目链接:
http://codeforces.com/problemset/problem/645/D
题意:
给定n个机器人的m个能力大小关系,问你至少要前几个大小关系就可以得到所有机器人的能力顺序。
分析:
拓扑+二分。
注意最终的顺序不能缺点,先把度为0的点入队,如果度为0的点的个数大于1,则说明至少有两个点的能力大小不确定,无法继续。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100005;
vector<int>G[maxn];
int in[maxn], out[maxn];
int ef[maxn], et[maxn];
int n, m;
bool judge(int mid)
{
memset(in, 0 ,sizeof(in));
for(int i = 1; i <= n; i++)
G[i].clear();
for(int i = 0; i < mid; i++){
G[ef[i]].push_back(et[i]);
in[et[i]]++;
}
queue<int>q;
for(int i = 1; i <= n; i++){
if(!in[i]) q.push(i);
}
while(!q.empty()){
int u = q.front();q.pop();
if(q.size()) return false;
for(int i = 0; i < G[u].size(); i++){
int v = G[u][i];
in[v]--;
if(!in[v]) q.push(v);
}
}
return true;
}
int main (void)
{
cin>>n>>m;
for(int i = 0; i < m; i++){
scanf("%d%d", &ef[i], &et[i]);
}
int l = 0, r = m;
while(l < r - 1){
int mid = (l + 1 +r)/2;
if(judge(mid)) r = mid;
else l = mid;
}
if(r == m && !judge(m)) return cout<<-1<<endl,0;
else cout<<r<<endl;
return 0;
}
最新文章
- atitit.获取北京时间CST 功能api总结 O7
- C# ManualResetEvent 的方法介绍
- 村村通(codevs 2627)
- 转 Web移动应用调试工具——Weinre
- Oracle 10g安装64位图解流程
- magento安装以及搬家的注意事项
- pstack使用和原理
- JavaScript模块化开发一瞥
- careercup-数组和字符串1.6
- 求斐波那契数列的第n项
- mac os x10.11.2系统eclipse无法读取环境变量的问题
- python作业设计:输入用户名密码,认证成功后显示欢迎信息,输错三次后锁定
- Go 语言函数
- boost::function 介绍
- HDU-2767-tarjan/Kosaraju求scc
- centOS 6.5关闭防火墙步骤
- c# is 和 as 的区别和使用
- 视差滚动(Parallax Scrolling)插件补充
- 目标跟踪之Lukas-Kanade光流法(转)
- Sphider + SCWS 打造完美PHP中文搜索引擎