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相关推荐

  1. 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. 【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都必须是 ...

  3. POJ - 3678 Katu Puzzle(2-SAT)

    题目链接:点击查看 题目大意:给出n个数字,以及m个关系,每个关系只可能是xor.and或or其中之一,问能否有一种赋值满足所有m个关系 题目分析:2-SAT模板题,因为每个关系中的a和b都有一定的关 ...

  4. Katu Puzzle(POJ-3678)

    Problem Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labe ...

  5. poj3678 Katu Puzzle 【解法一】

    Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...

  6. POJ 1651 Multiplication Puzzle(类似矩阵连乘 区间dp)

    传送门:http://poj.org/problem?id=1651 Multiplication Puzzle Time Limit: 1000MS   Memory Limit: 65536K T ...

  7. poj - 1651 Multiplication Puzzle

    简单DP,矩阵相乘,这次尝试自己写一个,居然过了,很好.本来今天还水了poj 1088 二维空间最长下降(上升)序列和 poj 3624 超水0,1背包,也想贴出来凑数的,可是zxpn同志说,这么水的 ...

  8. POJ - 1651 Multiplication Puzzle (区间dp)

    题目链接:Multiplication Puzzle 定义状态dp[i][j]表示将区间[i, j]全部取完所需要的最小代价,答案就是dp[1][n - 2]. 状态转移方程为:dp[i][j] = ...

  9. POJ 1651 Multiplication Puzzle 区间dp(水

    题目链接:点击打开链 题意: 给定一个数组,每次能够选择内部的一个数 i 消除,获得的价值就是 a[i-1] * a[i] * a[i+1] 问最小价值 思路: dp[l,r] = min( dp[l ...

最新文章

  1. Servlet的初始化参数
  2. python-opencv时间计算,视频物体追踪标记
  3. 感谢所有支持wuhan2020项目的朋友!我们招换更多人加入!
  4. 团队二阶段冲刺个人工作总结2
  5. linux编译bzip2,linux bzip2 命令详解
  6. Spring Boot 2.1.5(27)---WebFlux REST API 全局异常处理 Error Handling
  7. InnoDB缓存相关优化
  8. 计算机网络 chapter 6 应用层
  9. 076 hashlib模块和hmac模块
  10. 基于钉钉服务简单监控
  11. docker重置mysql密码
  12. 证明您履历表经验的防弹五步法
  13. C++之binary_search二分查找算法
  14. 获取当前时间精确到毫秒
  15. 2021武汉建港中学高考成绩查询,武汉2021年部分示范高中四月调考分数线(预估)...
  16. 谈一谈PAC学习理论
  17. EA开发系列---技术指标的使用
  18. 文章本天成 妙手偶得之 两句三年得 一吟双泪流
  19. 右键文件或文件夹或空白处弹出菜单包含自己软件快捷方式
  20. luoguP4568 [JLOI2011]飞行路线

热门文章

  1. 面试:一文搞懂 final 关键字的作用
  2. 集成LNMP/LAMP/FAMP的LuNamp2.1正式版开源发布
  3. Magento教程 13:在Magento中设定联络表单的收件信箱
  4. Samba 和Shell Script 的应用
  5. PHP 判断用户语言跳转网页
  6. FCKeditor + smarty
  7. self-trainning, co-trainning
  8. redis cluster管理工具redis-trib.rb详解
  9. SQL Server 关联
  10. Mysql的安装和配置