题目地址:CF1100E Andrew and Taxi

二分,每次取到一个 \(mid\) ,只保留长度 \(>mid\) 的边

dfs判环,若有环,说明 \(ans>mid\) ,否则 \(ans≤mid\)

找到 \(ans\) 后,对长度 \(>ans\) 的边进行一次拓扑排序,对多余的点直接接在拓扑排序序列后面即可

对从 \(x\) 到 \(y\) 的长度 \(≤ans\) 的边,如果 \(x\) 在拓扑排序序列中的位置比 \(y\) 后,则这条边需取反

时间复杂度 \(O(n\ log\ C)\)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 100006;
  4. int n, m, mx = 0, d[N], b[N], t;
  5. int Head[N], Edge[N], Leng[N], Next[N], Pose[N];
  6. vector<int> ans;
  7. bool v[N], w[N];
  8. queue<int> q;
  9. inline void add(int x, int y, int z, int i) {
  10. Edge[i] = y;
  11. Leng[i] = z;
  12. Next[i] = Head[x];
  13. Head[x] = i;
  14. Pose[i] = x;
  15. }
  16. bool dfs(int x, int now) {
  17. v[x] = 1;
  18. w[x] = 1;
  19. for (int i = Head[x]; i; i = Next[i]) {
  20. int y = Edge[i], z = Leng[i];
  21. if (z <= now) continue;
  22. if (w[y] || !dfs(y, now)) return 0;
  23. }
  24. w[x] = 0;
  25. return 1;
  26. }
  27. inline bool pd(int now) {
  28. memset(v, 0, sizeof(v));
  29. memset(w, 0, sizeof(w));
  30. for (int i = 1; i <= n; i++)
  31. if (!v[i] && !dfs(i, now)) return 0;
  32. return 1;
  33. }
  34. void topsort(int now) {
  35. for (int i = 1; i <= n; i++)
  36. if (!d[i]) q.push(i);
  37. while (q.size()) {
  38. int x = q.front();
  39. q.pop();
  40. b[x] = ++t;
  41. for (int i = Head[x]; i; i = Next[i]) {
  42. int y = Edge[i], z = Leng[i];
  43. if (z > now && !--d[y]) q.push(y);
  44. }
  45. }
  46. }
  47. unsigned int work(int now) {
  48. for (int i = 1; i <= m; i++) {
  49. int y = Edge[i], z = Leng[i];
  50. if (z > now) ++d[y];
  51. }
  52. topsort(now);
  53. for (int i = 1; i <= n; i++)
  54. if (!b[i]) b[i] = ++t;
  55. for (int i = 1; i <= m; i++) {
  56. int x = Pose[i], y = Edge[i], z = Leng[i];
  57. if (z <= now && b[x] > b[y]) ans.push_back(i);
  58. }
  59. return ans.size();
  60. }
  61. int main() {
  62. cin >> n >> m;
  63. for (int i = 1; i <= m; i++) {
  64. int x, y, z;
  65. scanf("%d %d %d", &x, &y, &z);
  66. add(x, y, z, i);
  67. mx = max(mx, z);
  68. }
  69. int l = 0, r = mx;
  70. while (l < r) {
  71. int mid = (l + r) >> 1;
  72. if (pd(mid)) r = mid;
  73. else l = mid + 1;
  74. }
  75. cout << l << " " << work(l) << endl;
  76. for (unsigned int i = 0; i < ans.size(); i++)
  77. printf("%d ", ans[i]);
  78. return 0;
  79. }

CF1100E Andrew and Taxi的更多相关文章

  1. CF1100E Andrew and Taxi 二分答案+拓扑排序

    \(\color{#0066ff}{ 题目描述 }\) 给定一个有向图,改变其中某些边的方向,它将成为一个有向无环图. 现在求一个改变边方向的方案,使得所选边边权的最大值最小. \(\color{#0 ...

  2. CF-1100 E Andrew and Taxi

    CF-1100E Andrew and Taxi https://codeforces.com/contest/1100/problem/E 知识点: 二分 判断图中是否有环 题意: 一个有向图,每边 ...

  3. CF 1100E Andrew and Taxi(二分答案)

    E. Andrew and Taxi time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  4. E. Andrew and Taxi(二分+拓扑判环)

    题目链接:http://codeforces.com/contest/1100/problem/E 题目大意:给你n和m,n代表有n个城市,m代表有m条边,然后m行输入三个数,起点,终点,花费.,每一 ...

  5. Andrew and Taxi CodeForces - 1100E (思维,拓扑)

    大意: 给定有向图, 每条边有一个权值, 假设你有$x$个控制器, 那么可以将所有权值不超过$x$的边翻转, 求最少的控制器数, 使得翻转后图无环 先二分转为判定问题. 每次check删除能动的边, ...

  6. Codeforces Round #532 (Div. 2) E. Andrew and Taxi(二分+拓扑排序)

    题目链接:https://codeforces.com/contest/1100/problem/E 题意:给出 n 个点 m 条边的有向图,要翻转一些边,使得有向图中不存在环,问翻转的边中最大权值最 ...

  7. E - Andrew and Taxi-二分答案-topo判环

    E - Andrew and Taxi 思路 :min max   明显二分答案,二分需要破坏的那些边的中机器人数量最多的那个. check 过程建边时直接忽略掉小于 mid 的边,这样去检验有无环存 ...

  8. Codeforces Round #532

    以后不放水题了 C.NN and the Optical Illusion 复习一下高中数学即可 $\frac{ans}{ans+r}=\sin \frac{\pi}{n}$ 解方程 #include ...

  9. Codeforces Round #532 (Div. 2) Solution

    A. Roman and Browser 签到. #include <bits/stdc++.h> using namespace std; ]; int get(int b) { ]; ...

随机推荐

  1. Collection 接口

    Collection 接口中的方法 ArrayList implements List List extends Collection 主要方法:toArray(); 集合转数组 clear(); 清 ...

  2. MySQL双主+keeplived安装部署说明

    MySQL双主+keeplived安装部署说明 一.环境介绍 1.1.规划 序号 类别 版本 主机名 IP 端口 备注 1 OS CentOS release 6.9 (Final) (minimal ...

  3. expdp和impdp导入导出用法【转】

    关于expdp和impdp exp和imp是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用.expdp和impdp是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用.i ...

  4. 【坑】zsh和oh-my-zsh卸载后导致无法登陆

    apt-get remove zsh 然后断开终端,就再也连不上了,崩溃啊! 以下登陆为www用户登陆 各种找,到这里 https://www.cnblogs.com/EasonJim/p/78630 ...

  5. 数据建模工具系列 之 让Oracle Data Modeler支持Vertica

    引子 在上篇博客中重点介绍了几个建模工具的评估, 并选定了SQL Power Architect作为最终的建模工具, 在评估过程中也对Oracle Data Modeler支持Vertica做了点研究 ...

  6. termux 开启 sshd

    众所周知, termux 上的 sshd 不能通过 IP 连接, 只能使用密钥, 对于使用 PuTTY 的 Windows 用户, 怎么办呢? 由于 PuTTY 支持 telnet, 而 termux ...

  7. 经典文摘:饿了么的 PWA 升级实践(结合Vue.js)

    自 Vue.js 官方推特第一次公开到现在,我们就一直在进行着将饿了么移动端网站升级为 Progressive Web App 的工作.直到近日在 Google I/O 2017 上登台亮相,才终于算 ...

  8. Python3快速入门

    ——<趣学Python-教孩子学编程>学习笔记 1.注释 (1)单行注释以  #  开头注释 # 这是一个注释 print("Hello, World!") (2)多行 ...

  9. Hibernate使用套路,新手请进

    package cn.zhaoqinrong.MainApp; import org.apache.log4j.Logger; import org.hibernate.HibernateExcept ...

  10. 二十七、Linux 进程与信号---进程组和组长进程

    27.1 进程组 27.1.1 进程组介绍 进程组为一个或多个进程的集合 进程组可以接受同一终端的各种信号,同一个信号发送进程组等于发送给组中的所有进程 每个进程组有唯一的进程组 ID 进程组的消亡要 ...