题目链接

题意:给出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 什么啊这是=_=...

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int Maxn = * + ;
const int Maxm = * +;
struct Edge
{
int to, Next;
}edge[Maxm];
int head[Maxn], tot;
void init()
{
tot = ;
memset(head, -, sizeof(head));
}
void addedge(int u, int v)
{
edge[tot].to = v;
edge[tot].Next = head[u];
head[u] = tot++;
}
int low[Maxn], dfn[Maxn], Stack[Maxn], belong[Maxn];
int Index, top;
int scc;
bool Instack[Maxn];
void Tarjan(int u)
{
int v;
low[u] = dfn[u] = ++Index;
Stack[top++] = u;
Instack[u] = true;
for (int i = head[u]; i != -; i = edge[i].Next)
{
v = edge[i].to;
if (!dfn[v])
{
Tarjan(v);
if (low[u] > low[v])
low[u] = low[v];
}
else if (Instack[v] && low[u] > dfn[v])
low[u] = dfn[v];
}
if (low[u] == dfn[u])
{
scc++;
do
{
v = Stack[--top];
Instack[v] = false;
belong[v] = scc;
} while (u != v);
}
}
bool solvable(int n)
{
memset(dfn, , sizeof(dfn));
memset(low, , sizeof(low));
memset(belong, , sizeof(belong));
memset(Instack, false, sizeof(Instack));
Index = top = scc = ;
for (int i = ; i < n; i++)
{
if (!dfn[i])
Tarjan(i);
}
for (int i = ; i < n; i += )
{
if (belong[i] == belong[i ^ ] )
return false;
}
return true;
}
int main()
{
int n, m;
while (scanf("%d%d", &n, &m) != EOF)
{
init();
int a, b, c;
char op[];
while (m--)
{
scanf("%d%d%d%s", &a, &b, &c, op);
a = a * ; //这里要乘以2
b = b * ;
if (strcmp(op, "AND") == )
{
if (c)
{
addedge(a, a ^ );
addedge(b, b ^ );
}
else
{
addedge(a ^ , b);
addedge(b ^ , a);
}
}
else if (strcmp(op, "OR") == )
{
if (c)
{
addedge(a, b ^ );
addedge(b, a ^ );
}
else
{
addedge(a ^ , a);
addedge(b ^ , b);
}
}
else if (strcmp(op, "XOR") == )
{
if (c)
{
addedge(a, b ^ );
addedge(b, a ^ );
addedge(a ^ , b);
addedge(b ^ , a);
}
else
{
addedge(a, b);
addedge(b, a);
addedge(a ^ , b ^ );
addedge(b ^ , a ^ );
}
}
} if( solvable(n * ) )
printf("YES\n");
else
printf("NO\n"); }
return ;
}

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. 20160303 - 升级 Windows 10 版本 1511 后,文件夹默认打开方式为 cmd 的修复

    问题描述:升级 Windows 10 版本 1511 (OS 内部版本 10586.122)后,文件夹的默认打开方式变成了cmd.双击任何一个文件夹,显示相关的提示错误信息如下: [Window Ti ...

  2. KM模板

    var n,m,i,j:longint; ans:int64; sel,lx,ly,slack:..] of int64; a:..,..] of int64; visx,visy:..] of bo ...

  3. 屠龙之路_假期罢工和公主私奔_SixthDay

    摘要:屠龙少年经过一周的长途跋涉后,终于来到了传说中的周末客栈.周末客栈是屠龙之路的必经之地,屠龙少年可以在周末客栈补给干粮,修补装备,好好休息一下,以便更好的上路.周末客栈有个不成文的规定:凡入住者 ...

  4. 十天冲刺---Day5

    站立式会议 站立式会议内容总结: 燃尽图 照片 PM确实不应该交给组内编码最强的人来做. 编码的过程还要考虑整个项目的流程压力较大. 需要队友的支持和沟通.

  5. android与网络的交互

    有三种方式: 数据下载,数据上传,数据浏览 URL中一些符号 ?分隔URL和参数 &URL中参数之间的分隔符 =URL中参数对应的值

  6. [转]oracle学习入门系列之五内存结构、数据库结构、进程

    原文地址:http://www.2cto.com/database/201505/399285.html 1 Oracle数据库结构 关于这个话题,网上一搜绝对一大把,更别提书籍上出现的了,还有很多大 ...

  7. git log 格式化输出

    Git log --graph --pretty=format: '%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)& ...

  8. 【BZOJ 4600】【SDOI 2016】硬币游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=4600 转化成nim游戏 因为对于每一个反面朝上的硬币编号可以拆成\(2^a3^bc\),选择这个硬币 ...

  9. 【POJ 1228】Grandpa's Estate 凸包

    找到凸包后暴力枚举边进行$check$,注意凸包是一条线(或者说两条线)的情况要输出$NO$ #include<cmath> #include<cstdio> #include ...

  10. EasyIcon:免费图标搜索和下载平台

    EasyIcon是一个为设计师提供免费图标搜索和下载服务的网站. 步骤如下: 第一步,打开EasyIcon网站主页: http://www.easyicon.net/ 第二步,在EasyIcon网站的 ...