题目链接

题意:给出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. gravity、layout_gravity及orientation

    gravity.layout_gravity及orientation 最近在弄一个简单的界面:横向,添加一张准备好的背景图,在界面右边居中放置一个按钮.实现过程中发现对布局的主要属性没有想象中地那么熟 ...

  2. SQL Server output子句用法 output inserted.id 获取刚插入数据的id

    --插入数据,并返回刚刚插入的数据id INSERT INTO [soloreztest] ([name]) output inserted.id VALUES ('solorez') --执行结果: ...

  3. Windows7 x64配置 Apache2 + PHP5 + MySQL5

    1:相关软件下载: Apache HTTP Server             版本:(httpd-2.2.25-win32-x86-openssl-0.9.8y) PHP             ...

  4. java lambda表达式学习笔记

    lambda是函数式编程(FP,functional program),在java8中引入,而C#很早之前就有了.在java中lambda表达式是'->',在C#中是‘=>’. 杜甫说:射 ...

  5. oracle去重等基础问题

    --去重查询方法一:根据id select * from sxe where id in(select min(id) from sxe group by username) order by id ...

  6. [转]oracle设计数据库应选择正确的数据类型

    原文地址:http://blog.sina.com.cn/s/blog_5014663501007n40.html 在设计数据库的时候,选择正确的数据类型,往往可以避免很多的问题,正确理解数据库的类型 ...

  7. 数组的方法 Array.map();Array.every()和Array.some();数组的indexof();检测是否是数组isArray(obj);

    数组的方法 Array.map(); 栗子: var a=[1,2,,3]; var b=a.map( function(value){return value*value} ); alert(b); ...

  8. ES6新特性:Javascript中Set和WeakSet类型的数据结构

    ES6提供了新的数据结构Set,Set对象不是数组, 可以用来保存对象或者基本类型, 所有保存的值都是唯一的, chrome浏览器>38和FF>13,以及nodeJS,对Set支持良好, ...

  9. 强联通 HDU 2767 3836

    n个点m条边 最少需要几条边变成强连通图 设有a个结点的入读为0, b个结点的出度为0, 则 max{a, b}就是答案. 注意特殊情况: 当原图已经强连通时, 答案是0而不是1. 加一条边少一个入度 ...

  10. 51nod 1040最大公约数和(欧拉函数)

    1040 最大公约数之和 题目来源: rihkddd 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 给出一个n,求1-n这n个数,同n的最大公约数 ...