题目链接: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. hive 使用脚本清洗数据:时间戳转日期

    import sys import datetime for line in sys.stdin: line = line.strip() userid, movieid, rating, unixt ...

  2. Asp.Net MVC 控制器

    原文链接:http://www.asp.net/learn/mvc/ 这篇教程探索了ASP.NET MVC控制器(controller).控制器动作(controller action)和动作结果(a ...

  3. 2016-09-07 J2EE基础知识之JSP_部分

    1.JSP(Java Server Pages) java服务器页面,其根本是一个简化的Servlet设计.JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.h ...

  4. 【转】Centos 设置IP地址的几种方式

    对于很多刚刚接触linux的朋友来说,如何设置linux系统的IP地址,作为第一步,下面小编以centos系统为例,给大家演示如何给centos设置IP地址,如何修改linux 系统IP地址? 查看I ...

  5. 常用CSS HACK

    常用CSS HACK IE6 3像素bug和双边距bug一样的经典 现象: IE6下浮动元素和不浮动元素之间会有3px间隙(3px bug,div.float-left + div.float-non ...

  6. LBA(逻辑区块地址)及PBA(物理区块地址)

    LBA,全称为Logical Block Address,是PC数据存储装置上用来表示数据所在位置的通用机制,我们最常见到使用它的装置就是硬盘.LBA可以指某个数据区块的地址或者某个地址上所指向的数据 ...

  7. VM Agent 和扩展程序

    VM Agent 和扩展程序 - 第 1 部分  Windows Azure基础结构服务最近宣布了一项新功能VM Agent.VMAgent是一个轻量级进程,用于启动由Microsoft或合作伙伴 ...

  8. linux之多进程fork:进程通信

    ++++++++++++++++++信号机制+++++++++++++++++++ 接收信号 int signal(int sig,__sighandler_t handler); int func( ...

  9. oralce11g 注冊表卸载20140810

    Windows Registry Editor Version 5.00 [-HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE] [-HKEY_LOCAL_MACHINE\SOFT ...

  10. 虎扯:小众玩物 webkit家的滚动条

    前面的话:对只有一种浏览器支持的属性,就不要出来秀咱前端同学,就像是早些年手机们的充电口一样,集各家所长,咱今天说的是webkit的滚动条样式,视乎只有webkit支持此项定义,有见识的前辈来辩.这玩 ...