题目链接:

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;
}

最新文章

  1. atitit.获取北京时间CST 功能api总结 O7
  2. C# ManualResetEvent 的方法介绍
  3. 村村通(codevs 2627)
  4. 转 Web移动应用调试工具——Weinre
  5. Oracle 10g安装64位图解流程
  6. magento安装以及搬家的注意事项
  7. pstack使用和原理
  8. JavaScript模块化开发一瞥
  9. careercup-数组和字符串1.6
  10. 求斐波那契数列的第n项
  11. mac os x10.11.2系统eclipse无法读取环境变量的问题
  12. python作业设计:输入用户名密码,认证成功后显示欢迎信息,输错三次后锁定
  13. Go 语言函数
  14. boost::function 介绍
  15. HDU-2767-tarjan/Kosaraju求scc
  16. centOS 6.5关闭防火墙步骤
  17. c# is 和 as 的区别和使用
  18. 视差滚动(Parallax Scrolling)插件补充
  19. 目标跟踪之Lukas-Kanade光流法(转)
  20. Sphider + SCWS 打造完美PHP中文搜索引擎

热门文章

  1. 离开APM的弹性云还是真弹性吗
  2. android应用流量信息提取
  3. Codeforces Gym 2015 ACM Arabella Collegiate Programming Contest(二月十日训练赛)
  4. Pygame - Python游戏编程入门
  5. Cocos工程命名规则整理(node部分)
  6. vueCode 常用代码总结 20190116
  7. PHP17 PDO
  8. 1-jdk的安装与配置
  9. 北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H)
  10. MySQL本地登录及数据库导入导出