题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3062

思路分析:将问题转换为2-SAT问题,需要注意的是将命题转换为有向图的方法;命题中A1, A2, C1, C2表示C1与C2不能同时出现,所以A1中C1出现等价于A2中C2 ^ 1出现,同理A2中C2出现等价于A1中C1^1出现,则形成了两条有向边;

代码如下:

  1. #include <cstdio>
  2. #include <vector>
  3. #include <cstring>
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. const int MAX_N = + ;
  8. struct TwoSAT {
  9. int n;
  10. vector<int> G[ * MAX_N];
  11. bool mark[ * MAX_N];
  12. int S[ * MAX_N], c;
  13.  
  14. void Init(int n)
  15. {
  16. this->n = n;
  17. for (int i = ; i <= * n; ++i)
  18. G[i].clear();
  19. memset(mark, , sizeof(mark));
  20. }
  21.  
  22. bool Dfs(int x)
  23. {
  24. if (mark[x ^ ]) return false;
  25. if (mark[x]) return true;
  26. mark[x] = true;
  27. S[c++] = x;
  28.  
  29. for (int i = ; i < G[x].size(); ++i)
  30. if (!Dfs(G[x][i]))
  31. return false;
  32. return true;
  33. }
  34.  
  35. void AddClause(int x, int x_val, int y, int y_val)
  36. {
  37. x = * x + x_val;
  38. y = * y + y_val;
  39. G[x].push_back(y ^ );
  40. G[y].push_back(x ^ );
  41. }
  42.  
  43. bool Solve()
  44. {
  45. for (int i = ; i < * n; i += )
  46. {
  47. if (!mark[i] && !mark[i + ])
  48. {
  49. c = ;
  50. if (!Dfs(i))
  51. {
  52. while (c > ) mark[S[--c]] = false;
  53. if (!Dfs(i + )) return false;
  54. }
  55. }
  56. }
  57. return true;
  58. }
  59. };
  60.  
  61. TwoSAT sat;
  62.  
  63. int main()
  64. {
  65. int n, m;
  66.  
  67. while (scanf("%d", &n) != EOF)
  68. {
  69. scanf("%d", &m);
  70. sat.Init(n);
  71. for (int i = ; i < m; ++i)
  72. {
  73. int x, x_val, y, y_val;
  74. scanf("%d %d %d %d", &x, &y, &x_val, &y_val);
  75. sat.AddClause(x, x_val, y, y_val);
  76. }
  77. bool ans = sat.Solve();
  78. if (ans)
  79. printf("YES\n");
  80. else
  81. printf("NO\n");
  82. }
  83. return ;
  84. }

hdoj 3062 Party(2-SAT)的更多相关文章

  1. [2-sat]HDOJ1824 Let's go home

    中问题 题意略 和HDOJ 3062一样 这里 每个队员都有 选 和 不选 两种, 即 上篇所说的$x$和$x’$ 建图:队长(a)留下或者其余两名队员(b.c)同时留下 那么就是$a' \Right ...

  2. [2-sat]HDOJ3062 Party

    中文题 题意略 学2-sat啦啦啦 2-sat就是    矛盾的 ($x.x’$不能同时取) m对人 相互也有限制条件 取出其中n个人 也有可能是把一件东西分成 取/不取 相矛盾的两种情况 (那就要拆 ...

  3. HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  4. HDOJ 2317. Nasty Hacks 模拟水题

    Nasty Hacks Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  5. HDOJ 1326. Box of Bricks 纯水题

    Box of Bricks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  6. 多边形碰撞 -- SAT方法

    检测凸多边形碰撞的一种简单的方法是SAT(Separating Axis Theorem),即分离轴定理. 原理:将多边形投影到一条向量上,看这两个多边形的投影是否重叠.如果不重叠,则认为这两个多边形 ...

  7. HDOJ 1004 Let the Balloon Rise

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...

  8. hdoj 1385Minimum Transport Cost

    卧槽....最近刷的cf上有最短路,本来想拿这题复习一下.... 题意就是在输出最短路的情况下,经过每个节点会增加税收,另外要字典序输出,注意a到b和b到a的权值不同 然后就是处理字典序的问题,当松弛 ...

  9. HDU 3062 && HDU 1824 && POJ 3678 && BZOJ 1997 2-SAT

    一条边<u,v>表示u选那么v一定被选. #include <iostream> #include <cstring> #include <cstdio> ...

随机推荐

  1. 获取extjs text列修改过 数据

    ExtJS中表格的特性简介 表格由类Ext.grid.GridPanel定义,继承自Ext.Panel,xtype为grid 表格的列信息由Ext.grid.ColumnModel定义 表格的数据存储 ...

  2. [原创] 小而美 | Mac上鲜为人知,但极大提升效率的小工具

    热爱收集实用又好用的软件,工具类软件不在多,发挥作用,提高效率最重要~推荐几个压箱底的藏货 一.Noizio -自然而然的白噪声,专注工作 Noizio是一款OS X 下的白噪音应用,可以让自己觉着是 ...

  3. Oracle与SQL自治事务

    自治事务 自治事务是独立的事务操作,如果考虑到事务回滚,必须单独写成一个触发器来完成, 一个事务A在另一个事务B内被调用,那个事务A是自治事务,自治事务A执行过程中会脱离其session内未执行完毕的 ...

  4. unexpected token: null near line 1, column 290

    org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: null near line 1, column 290 ...

  5. day5_python学习笔记_chapter7_字典

    1. 内建方法fromkeys()创建一个默认字典, 字典中元素具有相同的值,默认为None dict1 = {}.fromkeys(('x', 'y'), -1) 2. 访问字典中的值,  for ...

  6. hadoop搭建杂记:Linux下ssh免密码登陆

    关于ssh免密码登陆的问题 关于ssh免密码登陆的问题 linux下可以用ssh-keygen来生成公钥/私钥对 ①生成id_rsa和id_rsa.pub公钥/私钥对,自动在~/.ssh下生成文件(亦 ...

  7. android netty5.0 编译时 java.lang.NoClassDefFoundError: io.netty.channel.nio.NioEventLoopGroup

    android netty5.0 编译时 java.lang.NoClassDefFoundError: io.netty.channel.nio.NioEventLoopGroup 复制netty包 ...

  8. zoj 2071 Technology Trader 最大权闭合子图

    传送门 和上一题一样, 也是一个最大权闭合子图.不过建图好麻烦的感觉  写了好久. 源点和原材料连边, 权值为val. 汇点和产品连边, 权值为val. 产品与和它有关系的材料连边, 权值inf. 最 ...

  9. D3.js学习记录 - 数据类型【转】【新】

    1.变量 JAVASCRIPT的变量是一种类型宽松的语言.定义变量不用指定数据类型.而且还是动态可变的. var value = 100;value = 99.9999;value = false;v ...

  10. aliyun 镜像

    [epel]name=Extra Packages for Enterprise Linux 6 - $basearchbaseurl=http://mirrors.aliyun.com/epel/6 ...