POJ 3678 Katu Puzzle(强连通 法)
题意:给出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(强连通 法)的更多相关文章
- 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 ...
- POJ 3678 Katu Puzzle (经典2-Sat)
Katu Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6553 Accepted: 2401 Descr ...
- POJ 3678 Katu Puzzle(2-SAT,合取范式大集合)
Katu Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9987 Accepted: 3741 Descr ...
- 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 ...
- POJ 3678 Katu Puzzle (2-SAT)
Katu Puzzle Time Limit: 1000MS ...
- 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 ...
- POJ 3678 Katu Puzzle 2-SAT 强连通分量 tarjan
http://poj.org/problem?id=3678 给m条连接两个点的边,每条边有一个权值0或1,有一个运算方式and.or或xor,要求和这条边相连的两个点经过边上的运算后的结果是边的权值 ...
- poj 3678 Katu Puzzle(Two Sat)
题目链接:http://poj.org/problem?id=3678 代码: #include<cstdio> #include<cstring> #include<i ...
- POJ 3678 Katu Puzzle
Description 给出一个关系,包括 And,Xor,Or 问是否存在解. Sol 经典的2-SAT问题. 把每个值看成两个点,一个点代表选 \(0\) ,另一个代表选 \(1\) . 首先来看 ...
随机推荐
- 隐马尔可夫模型(Hidden Markov Model,HMM)
介绍 崔晓源 翻译 我们通常都习惯寻找一个事物在一段时间里的变化规律.在很多领域我们都希望找到这个规律,比如计算机中的指令顺序,句子中的词顺序和语音中的词顺序等等.一个最适用的例子就是天气的预测. 首 ...
- redis入门配置
简介: Redis是Nosql中比较出名的,分布式数据库缓存,提升相应的速度,降低对数据库的访问! Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,(永久 ...
- [AJAX系列]$.get(url,[data],[fn],[type])
$.get(url,[data],[fn],[type]) 概述 通过远程HTTP GET请求载入信息 参数 url:待载入页眉的URL地址 data:待发送key/value参数 callback: ...
- mysql 安装失败解决方法
在安装mysql的过程中,出现的最麻烦的问题和解决方法 安装后,启动不成功,就卡了,程序就没有响应. 如何解决: 找到mysql安装目录下的 #Path to the database root da ...
- js函数声明
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- nginx.conf的events,http段一般固定配置
nginx.conf的events,http段一般固定配置 user nobody nobody; #使用的用户可以按照实际情况修改 worker_processes ; #指定nginx开启的进程数 ...
- 【POJ 1269】判断两直线相交
题 利用叉积解方程 #include <cstdio> #define MAX 1<<31 #define dd double int xmult(dd x1,dd y1,dd ...
- BZOJ 2683: 简单题
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 913 Solved: 379[Submit][Status][Discuss] ...
- Leetcode Move Zeros
Given an array nums, write a function to move all 0's to the end of it while maintaining the relativ ...
- 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 339 Solved: 130[Submit][Status][Discuss] D ...