hdu3715

题意

给出一个递归的伪代码,当 x[a[dep]] + x[b[dep]] != c[dep],就向下递归,给出a,b,c数组的值 问 dep 最大多少。其中 0 <= c[i] <= 2 ,0 <= x[i] <= 1。

分析

x 取值存在对立关系( 1或0 ),那么可以通过不等式进行建边,有三种情况,

  1. 当 c[i] = 2 时,有 A and B = 0,即不能全部为真
  2. 当 c[i] = 1 时,有 A xor B = 0,加起来不能等于1
  3. 当 c[i] = 0 时,有 A or B != 0

二分m,判断可行性

code

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<iostream>
  6. using namespace std;
  7. const int MAXN = 5e2 + 10;
  8. const int MAXM = 1e4 + 10;
  9. int n, m;
  10. int vis[MAXN];
  11. int flag[MAXN]; // 所属强连通分量的拓扑序
  12. vector<int> G[MAXN], rG[MAXN]; // 注意初始化
  13. vector<int> vs; // 后序遍历顺序的顶点列表
  14. void addedge(int x, int y)
  15. {
  16. G[x].push_back(y); // 正向图
  17. rG[y].push_back(x); // 反向图
  18. }
  19. void dfs(int u)
  20. {
  21. vis[u] = 1;
  22. for(int i = 0; i < G[u].size(); i++)
  23. {
  24. int v = G[u][i];
  25. if(!vis[v]) dfs(v);
  26. }
  27. vs.push_back(u);
  28. }
  29. void rdfs(int u, int k)
  30. {
  31. vis[u] = 1;
  32. flag[u] = k;
  33. for(int i = 0; i < rG[u].size(); i++)
  34. {
  35. int v = rG[u][i];
  36. if(!vis[v]) rdfs(v, k);
  37. }
  38. }
  39. int scc() // 强连通分量的个数
  40. {
  41. vs.clear();
  42. memset(vis, 0, sizeof vis);
  43. for(int i = 0; i < n; i++)
  44. if(!vis[i]) dfs(i);
  45. memset(vis, 0, sizeof vis);
  46. int k = 0;
  47. for(int i = vs.size() - 1; i >= 0; i--)
  48. if(!vis[vs[i]]) rdfs(vs[i], k++);
  49. return k;
  50. }
  51. bool judge()
  52. {
  53. int N = n;
  54. n = 2 * n;
  55. scc();
  56. n /= 2;
  57. for(int i = 0; i < N; i++)
  58. if(flag[i] == flag[N + i])
  59. return false;
  60. return true;
  61. }
  62. int a[MAXM], b[MAXM], c[MAXM];
  63. void init(int can)
  64. {
  65. for(int i = 0; i < 2 * n; i++) G[i].clear(), rG[i].clear();
  66. for(int i = 0; i <= can; i++) // 注意这里是等号
  67. {
  68. if(c[i] == 2) // A and B = 0
  69. {
  70. addedge(a[i], b[i] + n);
  71. addedge(b[i], a[i] + n);
  72. }
  73. else if(c[i] == 1) // A xor B = 0
  74. {
  75. addedge(a[i], b[i]);
  76. addedge(a[i] + n, b[i] + n);
  77. addedge(b[i], a[i]);
  78. addedge(b[i] + n, a[i] + n);
  79. }
  80. else // A or B != 0
  81. {
  82. addedge(a[i] + n, b[i]);
  83. addedge(b[i] + n, a[i]);
  84. }
  85. }
  86. }
  87. void solve()
  88. {
  89. int l = 0, r = m, mid;
  90. while(l + 1 < r)
  91. {
  92. mid = (l + r) / 2;
  93. init(mid);
  94. if(judge()) l = mid;
  95. else r = mid;
  96. }
  97. printf("%d\n", l + 1); // 注意上面是等号,实际数量要加1
  98. }
  99. int main()
  100. {
  101. int T;
  102. scanf("%d", &T);
  103. while(T--)
  104. {
  105. scanf("%d%d", &n, &m);
  106. for(int i = 0; i < m; i++) scanf("%d%d%d", &a[i], &b[i], &c[i]);
  107. solve();
  108. }
  109. return 0;
  110. }

hdu3715的更多相关文章

  1. hdu3715 Go Deeper[二分+2-SAT]/poj2723 Get Luffy Out[二分+2-SAT]

    这题转化一下题意就是给一堆形如$a_i + a_j \ne c\quad (a_i\in [0,1],c\in [0,2])$的限制,问从开头开始最多到哪条限制全是有解的. 那么,首先有可二分性,所以 ...

  2. HDU3715(二分+2-SAT)

    Go Deeper Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  3. hdu3715 2-sat+二分

    Go Deeper 题意:确定一个0/1数组(size:n)使得满足最多的条件数.条件在数组a,b,c给出. 吐槽:哎,一水提,还搞了很久!关键是抽象出题目模型(如上的一句话).以后做二sat:有哪些 ...

  4. hdu3715 二分+2sat+建图

    题意:       给你一个递归公式,每多一层就多一个限制,问你最多能递归多少层. 思路:      先分析每一层的限制 x[a[i]] + x[b[i]] != c[i],这里面x[] = 0,1, ...

  5. 2-SAT算法

    参考blog 参考论文 参考论文 题目 & 题解 裸2-SAT poj3683 poj3207 poj3678 poj3648 2-SAT + 二分法 poj2723 poj2749 hdu3 ...

随机推荐

  1. 关于使用ModelSim中编写testbench模板问题

    对于初学者来说写Testbench测试文件还是比较困难的,但Modelsim和quartus ii都提供了模板,下面就如何使用Modelsim提供的模板进行操作. Modelsim提供了很多Testb ...

  2. 数据库问题(程序连接mysql错误)

    今天服务器遇到了一个很熟悉的问题 输入 #mysql -u root -p ERROR 2002 (HY000):Can't connect to local MySQL server 随即上网找寻答 ...

  3. Spring整合Quartz定时任务执行2次,Spring定时任务执行2次

    Spring整合Quartz定时任务执行2次,Spring定时任务执行2次 >>>>>>>>>>>>>>>&g ...

  4. 想成为Java高级工程师的看过来

    想成为Java高级工程师,有哪些要求呢? 1.Core Java,就是Java基础.JDK的类库,很多童鞋都会说,JDK我懂,但是懂还不足够,知其然还要知其所以然,JDK的源代码写的非常好,要经常查看 ...

  5. NI Vision for LabVIEW 基础(一):NI Vision 简介

    NI Vision 控件模板 Vision控件模板位于LabVIEW控件模板的最顶层,由一下元素组成: IMAQ Image.ctl—该控件是一个类型定义,用于声明图象类型的数据.在VI的前面板中使用 ...

  6. Git操作指南

    请访问以下网址,很详细,今天偷个懒记录一下,之后有时间再来补全吧! https://git-scm.com/book/zh/v2

  7. iOS开发 - CocoaPods安装和使用教程

    一.CocoaPods简介 1.什么是CocoaPods CocoaPods是iOS的包管理工具. 2.为什么要使用CocoaPods 在开发iOS项目时,经常会使用第三方开源库,手动引入流程复杂,并 ...

  8. Supervisor: A Process Control System

    Supervisor: 进程控制系统 概述:Supervisor是一个 Client/Server模式的系统,允许用户在类unix操作系统上监视和控制多个进程,或者可以说是多个程序. 它与launch ...

  9. Omi树组件omi-tree编写指南

    Omi框架能够以少量的代码声明式地编写可拖拽移动节点的树形组件. 通常树组件能够考验UI框架的健壮性,因为需要使用到UI框架的如下特性: 组件嵌套 组件传值 组件批量传值 组件依赖自身递归嵌套(nes ...

  10. VS2017使用 SQL Localdb问题两则

    VS2017使用 SQL  Localdb问题两则 来博客园不算短了,总是索取者.最近使用VS2017,遇到一些问题,在解决时总是找不到拿来就能用的解决方案,在多方寻找,自行探索下,总算圆满解决,在这 ...