题目链接

题意:给出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. learning to rank

    Learning to Rank入门小结 + 漫谈 Learning to Rank入门小结 Table of Contents 1 前言 2 LTR流程 3 训练数据的获取4 特征抽取 3.1 人工 ...

  2. hihocoder1033交错和

    题目链接 坑: 1.ll x,y; z=x*y;可能会溢出,于是我写成x%mod*y%mod 仍旧错误,要写成x%mod*(y%mod). 2.f(9019)=1. 要注意如果为0,下一位的符号根据0 ...

  3. python 英文字串首字母改为大写

    #英文字串首字母改为大写 st = "string" St = st[0].upper() + st[1:] 2016-10-22 后来了解到 python 内部有相关实现,感觉  ...

  4. AsyncTask异步任务类使用学习

    new MyAsyncTask() .execute("http://pic.baike.soso.com/p/20120716/bki-20120716095331-640956396.j ...

  5. [转]Spring的事务管理难点剖析(1):DAO和事务管理的牵绊

    原文地址:http://stamen.iteye.com/blog/1441758 有些人很少使用Spring而不使用Spring事务管理器的应用,因此常常有人会问:是否用了Spring,就一定要用S ...

  6. [转]响应式WEB设计学习(1)—判断屏幕尺寸及百分比的使用

    原文地址:http://www.jb51.net/web/70360.html 现在移动设备越来越普及,用户使用智能手机.pad上网页越来越普遍.但是传统的fix型的页面在移动终端上无法很好的显示.因 ...

  7. hadoop,mapreduce---分布式计算

    从图中可以看出,map阶段的shuffle: 例如word count,当内存缓冲区满的时候会写到磁盘,一个spill,每个spill,进行分区,排序,最后将同一个分区word合并在一起,写入到磁盘中 ...

  8. HTML 5 video 标签跨浏览器兼容

    <video width="320" height="240" controls>   <source src="movie.mp4 ...

  9. eclipse-插件安装的三种方式

    (前两种安装方式以多国语言包的安装为例) 1.  普通安装:用直接解压的安装方式来实现 解压插件到某个文件夹 将下载的插件文件解压到 Eclipse 的安装目录下 如插件文件为多国语言包: NLpac ...

  10. iOS音频

    随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操 ...