题意:

      给你一个递归公式,每多一层就多一个限制,问你最多能递归多少层。

思路:

     先分析每一层的限制 x[a[i]] + x[b[i]] != c[i],这里面x[] = 0,1,c[i] = 0,1,2

如果我们把 x[]=0,1想成取或不取,就是基础的关系,那么这个题目就可以直接抽象成2sat问题,然后我们二分去枚举深度,每次根据2sat的结果判断二分走向,我的2sat用的是双深搜的强连通,用那个t打头的也行,随意,这样这个题目就ok了,对了下面总结下2sat的建图吧,这个题目也能用上。


  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stack>
  4.  
  5. #define N_node 500 + 10
  6. #define N_edge 100000 + 100

  7. using namespace std;
  8. typedef struct
  9. {
  10. int to ,next;
  11. }STAR;
  12.  
  13. STAR E1[N_edge] ,E2[N_edge];
  14. int list1[N_node] ,list2[N_node] ,tot;
  15. int Belong[N_node] ,cnt;
  16. int mark[N_node];
  17. int A[11000] ,B[11000] ,C[11000];
  18. stack<int>st;
  19. void add(int a ,int b)
  20. {
  21. E1[++tot].to = b;
  22. E1[tot].next = list1[a];
  23. list1[a] = tot;
  24.  
  25. E2[tot].to = a;
  26. E2[tot].next = list2[b];
  27. list2[b] = tot;
  28. }
  29. void DFS1(int s)
  30. {
  31. mark[s] = 1;
  32. for(int k = list1[s] ;k ;k = E1[k].next)
  33. if(!mark[E1[k].to]) DFS1(E1[k].to);
  34. st.push(s);
  35. }
  36. void DFS2(int s)
  37. {
  38. mark[s] = 1;
  39. Belong[s] = cnt;
  40. for(int k = list2[s] ;k ;k = E2[k].next)
  41. if(!mark[E2[k].to]) DFS2(E2[k].to);
  42. }
  43. bool ok(int mid ,int n)
  44. {
  45. memset(list1 ,0 ,sizeof(list1));
  46. memset(list2 ,0 ,sizeof(list2));
  47. tot = 1;
  48. for(int i = 1 ;i <= mid ;i ++)
  49. {
  50. int x = A[i] * 2 ,xx = A[i] * 2 + 1;
  51. int y = B[i] * 2 ,yy = B[i] * 2 + 1;
  52. if(C[i] == 0) add(xx ,y) ,add(yy ,x);
  53. if(C[i] == 1) add(x ,y) ,add(y ,x) ,add(xx ,yy) ,add(yy ,xx);
  54. if(C[i] == 2) add(y ,xx) ,add(x ,yy);
  55. }
  56. memset(mark ,0 ,sizeof(mark));
  57. while(!st.empty()) st.pop();
  58. for(int i = 0 ;i < n * 2 ;i ++)
  59. if(!mark[i]) DFS1(i);
  60. memset(mark ,0 ,sizeof(mark));
  61. cnt = 0;
  62. while(!st.empty())
  63. {
  64. int xin = st.top();
  65. st.pop();
  66. if(mark[xin]) continue;
  67. cnt ++;
  68. DFS2(xin);
  69. }
  70. int mk = 0;
  71. for(int i = 0 ;i < n * 2 && !mk ;i += 2)
  72. if(Belong[i] == Belong[i^1]) mk = 1;
  73. return !mk;
  74. }
  75. int main ()
  76. {
  77. int t ,n ,m ,i;
  78. scanf("%d" ,&t);
  79. while(t--)
  80. {
  81. scanf("%d %d" ,&n ,&m);
  82. for(i = 1 ;i <= m ;i ++)
  83. scanf("%d %d %d" ,&A[i] ,&B[i] ,&C[i]);
  84. int low ,mid ,up ,ans = 0;
  85. low = 0 ,up = m;
  86. while(low <= up)
  87. {
  88. mid = (low + up) >> 1;
  89. if(ok(mid ,n))
  90. ans = mid ,low = mid + 1;
  91. else up = mid - 1;
  92. }
  93. printf("%d\n" ,ans);
  94. }
  95. return 0;
  96. }

hdu3715 二分+2sat+建图的更多相关文章

  1. HDU 3036 Escape 网格图多人逃生 网络流||二分匹配 建图技巧

    题意: 每一个' . '有一个姑娘, E是出口,'.'是空地 , 'X' 是墙. 每秒钟每一个姑娘能够走一步(上下左右) 每秒钟每一个出口仅仅能出去一个人 给定n*m的地图, 时限T 问全部姑娘是否能 ...

  2. poj 3648 2-SAT建图+topsort输出结果

    其实2-SAT类型题目的类型比较明确,基本模型差不多是对于n组对称的点,通过给出的限制条件建图连边,然后通过缩点和判断冲突来解决问题.要注意的是在topsort输出结果的时候,缩点后建图需要反向连边, ...

  3. HDU3715(二分+2-SAT)

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

  4. TTTTTTTTTTTTTTTTT POJ 2226 草地覆木板 二分匹配 建图

    Muddy Fields Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9754   Accepted: 3618 Desc ...

  5. TTTTTTTTTTTTTTTTTT POJ 2724 奶酪消毒机 二分匹配 建图 比较难想

    Purifying Machine Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5004   Accepted: 1444 ...

  6. poj 3683 2-sat建图+拓扑排序输出结果

    发现建图的方法各有不同,前面一题连边和这一题连边建图的点就不同,感觉这题的建图方案更好. 题意:给出每个婚礼的2个主持时间,每个婚礼的可能能会冲突,输出方案. 思路:n个婚礼,2*n个点,每组点是对称 ...

  7. Eliminate the Conflict HDU - 4115(2-sat 建图 hhh)

    题意: 石头剪刀布 分别为1.2.3,有n轮,给出了小A这n轮出什么,然后m行,每行三个数a b k,如果k为0 表示小B必须在第a轮和第b轮的策略一样,如果k为1 表示小B在第a轮和第b轮的策略不一 ...

  8. poj 3678 Katu Puzzle 2-SAT 建图入门

    Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...

  9. POJ 2391 Ombrophobic Bovines ( 经典最大流 && Floyd && 二分 && 拆点建图)

    题意 : 给出一些牛棚,每个牛棚都原本都有一些牛但是每个牛棚可以容纳的牛都是有限的,现在给出一些路与路的花费和牛棚拥有的牛和可以容纳牛的数量,要求最短能在多少时间内使得每头牛都有安身的牛棚.( 这里注 ...

随机推荐

  1. Node更丝滑的打开方式

    Node更丝滑的打开方式 1. 使用背景 最近前端的一个项目,使用gulp作为工程化.在运行过程中出现如下错误 gulp[3192]: src\node_contextify.cc:628: Asse ...

  2. 在 .NET Core 中应用六边形架构

    在本文中,您会看到一个Web API应用的模板,在.NET Core 中应用了六边形架构,并且里面包含了一些基础功能. 介绍 这是一个模板项目,里面集成了一些必备的基础功能,当我们需要开发一个新项目时 ...

  3. ORM框架 和 面向对象编程

    ORM框架: 1.SQLAlchemy:  - 作用   1.提供简单的规则   2.自动转换成SQL语句  - DB first/code first   DB first: 手动创建数据库以及表  ...

  4. Springboot 轻量替代框架 Solon 1.3.10 发布

    Solon 是一个微型的Java开发框架.项目从2018年启动以来,参考过大量前人作品:历时两年,4000多次的commit:内核保持0.1m的身材,超高的跑分,良好的使用体验.支持:RPC.REST ...

  5. 什么是ETL?

    一.ETL概念之背景 随着企业的发展,目前的业务线越来越复杂,各个业务系统独立运营.例如:CRM系统只会生产CRM的 数据:Billing只会生产Billing的数据.各业务系统之间只关心自己的数据, ...

  6. 三分钟教你提升应用推送的ROI

    推送是App应用性价比最高也是最直接的营销运营手段,其细节颇多,非常考验运营人员的功力,本文将从ROI角度来分析怎么提升营销类推送的收益.(非IM类.系统类等功能服务型推送) 以一个日活100万的应用 ...

  7. Memory Networks02 记忆网络经典论文

    目录 1 Recurrent Entity Network Introduction 模型构建 Input Encoder Dynamic Memory Output Model 总结 2 hiera ...

  8. HashMap源码阅读(小白的java进阶)

    OverView 构造方法 //构造方法 public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < ...

  9. Python基础【基本数据类型】

    基本数据类型分类 数字            int 字符串         str 列表            list 字典            dict 元祖            tuple ...

  10. P1008_三连击(JAVA语言)

    /*  * 题目描述 将1,2,⋯,9共9个数分成3组, 分别组成3个三位数,且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数. 输入输出格式 输入格式: 木有输入 输出格式: 若 ...