POJ 3678 Katu Puzzle
POJ_3678
这是一个2-SAT的问题,很容易能够看出核心变量就是x[i],剩下的工作就是依c的值以及符号分析清楚各个x[i]之间的制约关系。
#include<stdio.h>#include<string.h>#define MAXD 2010#define MAXM 4000010int first[MAXD], next[MAXM], v[MAXM], e, N, M;int dfn[MAXD], low[MAXD], cnt, ins[MAXD], s[MAXD], top;int color[MAXD], col;char oper[][5]={"AND", "OR", "XOR"};int search(char *str){int i;for(i = 0; strcmp(str, oper[i]) != 0; i ++);return i;}void add_path(int i, int j){ v[e] = j; next[e] = first[i]; first[i] = e; e ++;}void buid(i, j, c, op){if(c) {if(op == 0) { add_path(2 * i, 2 * i + 1); add_path(2 * j, 2 * j + 1); }else if(op == 1) { add_path(2 * i, 2 * j + 1); add_path(2 * j, 2 * i + 1); }else if(op == 2) { add_path(2 * i, 2 * j + 1); add_path(2 * i + 1, 2 * j); add_path(2 * j, 2 * i + 1); add_path(2 * j + 1, 2 * i); } }else if(!c) {if(op == 0) { add_path(2 * i + 1, 2 * j); add_path(2 * j + 1, 2 * i); }else if(op == 1) { add_path(2 * i + 1, 2 * i); add_path(2 * j + 1, 2 * j); }else if(op == 2) { add_path(2 * i, 2 * j); add_path(2 * i + 1, 2 * j + 1); add_path(2 * j, 2 * i); add_path(2 * j + 1, 2 * i + 1); } }}void init(){int i, j, a, b, c, op;char str[5]; e = 0; memset(first, -1, sizeof(first));for(i = 0; i < M; i ++) { scanf("%d%d%d%s", &a, &b, &c, str); op = search(str); buid(a, b, c, op); }}void tarjan(int u){int i; dfn[u] = low[u] = ++ cnt;for(i = first[u]; i != - 1; i = next[i]) {if(!dfn[v[i]]) { s[top ++] = v[i]; ins[v[i]] = 1; tarjan(v[i]);if(low[v[i]] < low[u]) low[u] = low[v[i]]; }else if(ins[v[i]] && dfn[v[i]] < low[u]) low[u] = dfn[v[i]]; }if(low[u] == dfn[u]) {for(s[top] = -1; s[top] != u;) { top --; ins[s[top]] = 0; color[s[top]] = col; } col ++; }}int com(){int i; cnt = top = col = 0; memset(dfn, 0, sizeof(dfn)); memset(ins, 0, sizeof(ins));for(i = 0; i < 2 * N; i ++)if(!dfn[i]) { s[top ++] = i; ins[i] = 1; tarjan(i); }for(i = 0; i < 2 * N; i ++)if(color[i] == color[i ^ 1])return 0;return 1;}int main(){while(scanf("%d%d", &N, &M) == 2) { init();if(com()) printf("YES\n");else printf("NO\n"); }return 0; }
POJ 3678 Katu Puzzle相关推荐
- 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 ...
- 【2-SAT问题】解题报告:POJ 3678 Katu Puzzle(2-SAT问题的判定)
每个元素只有两种可能的取值,所以是2-SAT的模型. 我们建立2*n个点,x∈[1-n]表示x取0,x∈[n+1-n+n]表示x取1 考虑将所给的关系转化为有向边. u and v=1:u,v都必须是 ...
- POJ - 3678 Katu Puzzle(2-SAT)
题目链接:点击查看 题目大意:给出n个数字,以及m个关系,每个关系只可能是xor.and或or其中之一,问能否有一种赋值满足所有m个关系 题目分析:2-SAT模板题,因为每个关系中的a和b都有一定的关 ...
- Katu Puzzle(POJ-3678)
Problem Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labe ...
- poj3678 Katu Puzzle 【解法一】
Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...
- POJ 1651 Multiplication Puzzle(类似矩阵连乘 区间dp)
传送门:http://poj.org/problem?id=1651 Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K T ...
- poj - 1651 Multiplication Puzzle
简单DP,矩阵相乘,这次尝试自己写一个,居然过了,很好.本来今天还水了poj 1088 二维空间最长下降(上升)序列和 poj 3624 超水0,1背包,也想贴出来凑数的,可是zxpn同志说,这么水的 ...
- POJ - 1651 Multiplication Puzzle (区间dp)
题目链接:Multiplication Puzzle 定义状态dp[i][j]表示将区间[i, j]全部取完所需要的最小代价,答案就是dp[1][n - 2]. 状态转移方程为:dp[i][j] = ...
- POJ 1651 Multiplication Puzzle 区间dp(水
题目链接:点击打开链 题意: 给定一个数组,每次能够选择内部的一个数 i 消除,获得的价值就是 a[i-1] * a[i] * a[i+1] 问最小价值 思路: dp[l,r] = min( dp[l ...
最新文章
- Servlet的初始化参数
- python-opencv时间计算,视频物体追踪标记
- 感谢所有支持wuhan2020项目的朋友!我们招换更多人加入!
- 团队二阶段冲刺个人工作总结2
- linux编译bzip2,linux bzip2 命令详解
- Spring Boot 2.1.5(27)---WebFlux REST API 全局异常处理 Error Handling
- InnoDB缓存相关优化
- 计算机网络 chapter 6 应用层
- 076 hashlib模块和hmac模块
- 基于钉钉服务简单监控
- docker重置mysql密码
- 证明您履历表经验的防弹五步法
- C++之binary_search二分查找算法
- 获取当前时间精确到毫秒
- 2021武汉建港中学高考成绩查询,武汉2021年部分示范高中四月调考分数线(预估)...
- 谈一谈PAC学习理论
- EA开发系列---技术指标的使用
- 文章本天成 妙手偶得之 两句三年得 一吟双泪流
- 右键文件或文件夹或空白处弹出菜单包含自己软件快捷方式
- luoguP4568 [JLOI2011]飞行路线