题目链接

题意:给出a, b, c 和操作类型 (与或异或),问是否满足所有的式子

主要是建图:

对于 and , c == 1: 说明 a 和 b都是1,那么 0 就不能取, a' -> a , b' - > b ,因为 a 和 a'是对立事件,对于 a' - >a说明,a'如果成立,那么a也一定存在,显然这是不可能的所以a'不会 成立的。 c == 0 说明 a 和 b不全为1, a' -> b , b' -> a

对于 or,  c == 1 :说明 a 和 b 不全为 0 , a' -> b, b' -> a     c == 0 时 :说明 a 和 b 同时为0, a -> a' , b -> b‘  // a成立时候,a'可能不成立,所以a不会成立

对于xor, c == 1:说明 a 和 b不相等 , a -> b' , b -> a'  , a' -> b, b' - >a // a b不相等有两张情况, a == 0 || b == 0  ; a == 1 || b == 1, 每一种建立两条边

c == 0:说明 a 和 b 相等, a' -> b', b' -> a' , a - > b, b -> a   // a b相等有两种情况: a == b == 0, 或者 a == b == 1; 为什么不把前面ab同时为0 和 ab同时为1的情况合并呢, 合并肯定不对啊, a' -> a , a -> a',b- >b', b' - >b 什么啊这是=_=...

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <algorithm>
  5. using namespace std;
  6. const int Maxn = * + ;
  7. const int Maxm = * +;
  8. struct Edge
  9. {
  10. int to, Next;
  11. }edge[Maxm];
  12. int head[Maxn], tot;
  13. void init()
  14. {
  15. tot = ;
  16. memset(head, -, sizeof(head));
  17. }
  18. void addedge(int u, int v)
  19. {
  20. edge[tot].to = v;
  21. edge[tot].Next = head[u];
  22. head[u] = tot++;
  23. }
  24. int low[Maxn], dfn[Maxn], Stack[Maxn], belong[Maxn];
  25. int Index, top;
  26. int scc;
  27. bool Instack[Maxn];
  28. void Tarjan(int u)
  29. {
  30. int v;
  31. low[u] = dfn[u] = ++Index;
  32. Stack[top++] = u;
  33. Instack[u] = true;
  34. for (int i = head[u]; i != -; i = edge[i].Next)
  35. {
  36. v = edge[i].to;
  37. if (!dfn[v])
  38. {
  39. Tarjan(v);
  40. if (low[u] > low[v])
  41. low[u] = low[v];
  42. }
  43. else if (Instack[v] && low[u] > dfn[v])
  44. low[u] = dfn[v];
  45. }
  46. if (low[u] == dfn[u])
  47. {
  48. scc++;
  49. do
  50. {
  51. v = Stack[--top];
  52. Instack[v] = false;
  53. belong[v] = scc;
  54. } while (u != v);
  55. }
  56. }
  57. bool solvable(int n)
  58. {
  59. memset(dfn, , sizeof(dfn));
  60. memset(low, , sizeof(low));
  61. memset(belong, , sizeof(belong));
  62. memset(Instack, false, sizeof(Instack));
  63. Index = top = scc = ;
  64. for (int i = ; i < n; i++)
  65. {
  66. if (!dfn[i])
  67. Tarjan(i);
  68. }
  69. for (int i = ; i < n; i += )
  70. {
  71. if (belong[i] == belong[i ^ ] )
  72. return false;
  73. }
  74. return true;
  75. }
  76. int main()
  77. {
  78. int n, m;
  79. while (scanf("%d%d", &n, &m) != EOF)
  80. {
  81. init();
  82. int a, b, c;
  83. char op[];
  84. while (m--)
  85. {
  86. scanf("%d%d%d%s", &a, &b, &c, op);
  87. a = a * ; //这里要乘以2
  88. b = b * ;
  89. if (strcmp(op, "AND") == )
  90. {
  91. if (c)
  92. {
  93. addedge(a, a ^ );
  94. addedge(b, b ^ );
  95. }
  96. else
  97. {
  98. addedge(a ^ , b);
  99. addedge(b ^ , a);
  100. }
  101. }
  102. else if (strcmp(op, "OR") == )
  103. {
  104. if (c)
  105. {
  106. addedge(a, b ^ );
  107. addedge(b, a ^ );
  108. }
  109. else
  110. {
  111. addedge(a ^ , a);
  112. addedge(b ^ , b);
  113. }
  114. }
  115. else if (strcmp(op, "XOR") == )
  116. {
  117. if (c)
  118. {
  119. addedge(a, b ^ );
  120. addedge(b, a ^ );
  121. addedge(a ^ , b);
  122. addedge(b ^ , a);
  123. }
  124. else
  125. {
  126. addedge(a, b);
  127. addedge(b, a);
  128. addedge(a ^ , b ^ );
  129. addedge(b ^ , a ^ );
  130. }
  131. }
  132. }
  133.  
  134. if( solvable(n * ) )
  135. printf("YES\n");
  136. else
  137. printf("NO\n");
  138.  
  139. }
  140. return ;
  141. }

POJ 3678 Katu Puzzle(强连通 法)的更多相关文章

  1. poj 3678 Katu Puzzle(2-sat)

    Description Katu Puzzle ≤ c ≤ ). One Katu ≤ Xi ≤ ) such that for each edge e(a, b) labeled by op and ...

  2. POJ 3678 Katu Puzzle (经典2-Sat)

    Katu Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6553   Accepted: 2401 Descr ...

  3. POJ 3678 Katu Puzzle(2-SAT,合取范式大集合)

    Katu Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9987   Accepted: 3741 Descr ...

  4. POJ 3678 Katu Puzzle(2 - SAT) - from lanshui_Yang

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

  5. POJ 3678 Katu Puzzle (2-SAT)

                                                                         Katu Puzzle Time Limit: 1000MS ...

  6. 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 ...

  7. POJ 3678 Katu Puzzle 2-SAT 强连通分量 tarjan

    http://poj.org/problem?id=3678 给m条连接两个点的边,每条边有一个权值0或1,有一个运算方式and.or或xor,要求和这条边相连的两个点经过边上的运算后的结果是边的权值 ...

  8. poj 3678 Katu Puzzle(Two Sat)

    题目链接:http://poj.org/problem?id=3678 代码: #include<cstdio> #include<cstring> #include<i ...

  9. POJ 3678 Katu Puzzle

    Description 给出一个关系,包括 And,Xor,Or 问是否存在解. Sol 经典的2-SAT问题. 把每个值看成两个点,一个点代表选 \(0\) ,另一个代表选 \(1\) . 首先来看 ...

随机推荐

  1. 隐马尔可夫模型(Hidden Markov Model,HMM)

    介绍 崔晓源 翻译 我们通常都习惯寻找一个事物在一段时间里的变化规律.在很多领域我们都希望找到这个规律,比如计算机中的指令顺序,句子中的词顺序和语音中的词顺序等等.一个最适用的例子就是天气的预测. 首 ...

  2. redis入门配置

    简介: Redis是Nosql中比较出名的,分布式数据库缓存,提升相应的速度,降低对数据库的访问! Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,(永久 ...

  3. [AJAX系列]$.get(url,[data],[fn],[type])

    $.get(url,[data],[fn],[type]) 概述 通过远程HTTP GET请求载入信息 参数 url:待载入页眉的URL地址 data:待发送key/value参数 callback: ...

  4. mysql 安装失败解决方法

    在安装mysql的过程中,出现的最麻烦的问题和解决方法 安装后,启动不成功,就卡了,程序就没有响应. 如何解决: 找到mysql安装目录下的 #Path to the database root da ...

  5. js函数声明

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  6. nginx.conf的events,http段一般固定配置

    nginx.conf的events,http段一般固定配置 user nobody nobody; #使用的用户可以按照实际情况修改 worker_processes ; #指定nginx开启的进程数 ...

  7. 【POJ 1269】判断两直线相交

    题 利用叉积解方程 #include <cstdio> #define MAX 1<<31 #define dd double int xmult(dd x1,dd y1,dd ...

  8. BZOJ 2683: 简单题

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 913  Solved: 379[Submit][Status][Discuss] ...

  9. Leetcode Move Zeros

    Given an array nums, write a function to move all 0's to the end of it while maintaining the relativ ...

  10. 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 130[Submit][Status][Discuss] D ...