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 boolean operator op (one of AND, OR, XOR) and an integer c (0 ≤ c ≤ 1). One Katu is solvable if one can find each vertex Vi a value Xi (0 ≤ Xi ≤ 1) such that for each edge e(a, b) labeled by op and c, the following formula holds:Xa op Xb = cThe calculating rules are:

 

AND01
000
101
OR01
001
111
XOR01
001
110
Given a Katu Puzzle, your task is to determine whether it is solvable.

 

Input

The first line contains two integers N (1 ≤ N ≤ 1000) and M,(0 ≤ M ≤ 1,000,000) indicating the number of vertices and edges.
The following M lines contain three integers a (0 ≤ a < N), b(0 ≤ b < N), c and an operator op each, describing the edges.

 

Output

Output a line containing "YES" or "NO".

 

Sample Input

4 4
0 1 1 AND
1 2 1 OR
3 2 0 AND
3 0 0 XOR

 

Sample Output

YES

 

Hint

X0 = 1, X1 = 1, X2 = 0, X3 = 1.

 

Source

POJ Founder Monthly Contest – 2008.07.27, Dagger
胡乱地搞,竟然就AC了
借用别人的解题报告

思路:因为给出结点 a ,b,值 c,还有判断方式OP,这种一看当然就知道是用2SAT做了。为什么说是深刻理解2SAT呢,因为……2SAT中说过,只有关系确定的才能连边,否则不能连边;还有一个重要的是,如果某个条件必须为某个值时,自身与自身的相反条件也要连边,具体看下面解释:

现在设 2*a为1,2*a+1为0;当然 2*b为1,2*b+1为0:

1.当OP为’And‘时:

(1)当c=1时,那么只有a 与 b同时为1时,a  AND b才等于1,并且有且只有当a与b都为1时这个条件才成立,所以a与b一定要等1,所以连边<2*a+1,2*a>,<2*b+1,2*b>,表示不管怎么样,a与b的情况都等于1,即:当a等于0时a必等于1,b等于0时b必等于1,这个刚开始我看别人的解题报告就是这么说的,然后自己也没太理解,其实真正的内涵就是强制执行a与b都等于1 !(如果a等于1了的话当然这条边就没用了,如果a等于0的话,那么这条连就可以起到把a强制等于1以符合题目条件情况了,就是如此简单,得慢慢理解)

(2)当c=0时,那么当a等于0时,b可能为0也可以为1,所以是不确定关系,由上面说的一定是确定关系才能连边,所以a为0的情况就不能连边了;当a等于1时,b一定为0才能使 a AND b =0,所以连边:<2*a,2*b+1>,当然还有<2*b,2*a,+1>。

2.当OP为OR时,

(1)当c=1时,那么当a=1时,b=1或者b=0,所以当a=1时出现了两种关系,就是不确定了,就不用连边了;当a=0时,那么b一定=1,所以是确定关系,连边:<2*a+1,2*b>,当然还有<2*b+1,2*a>。

(2)当c=0时,那么只有当a=b=0这个关系,所以这个和上面1(1)情况就一样了,上面是强制执行a=b=1的情况,而这里因为只有a=b=0的情况,所以也要强制执行a=b=0,即连边:<2*a,2*a+1>,<2*b,2*b+1>。

3.当OP为XOR时,因为如果a=1,那么b必=0;a=0,b必=1;b=1,a必=0;b=0,a必=1。如此看,这四个关系都是确定的,所以都要连边,但是其实我们可以不连,一条边都不用连,因为出a=1的时候一定不会再出现a=0了,这四条边是不会产生矛盾的,所以强连通缩点后不会出现belong[2*a]=belong[2*a+1]的情况的,所以连了也没用,只是多加了点判断的时间罢了……这在别人的解题报告里说的是形成了组环了,都是一个意思。比如:a=1,b=0与b=0,a=1在tarjan中会形成一个新的结点,也就是自环,所以……在异或这种情况中只能选择a=0或者a=1,所以不会出现矛盾……故不用连边了!

  1 #pragma comment(linker, "/STACK:1024000000,1024000000")
  2 #include<iostream>
  3 #include<cstdio>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<math.h>
  7 #include<algorithm>
  8 #include<queue>
  9 #include<set>
 10 #include<bitset>
 11 #include<map>
 12 #include<vector>
 13 #include<stdlib.h>
 14 #include <stack>
 15 using namespace std;
 16 #define PI acos(-1.0)
 17 #define max(a,b) (a) > (b) ? (a) : (b)  
 18 #define min(a,b) (a) < (b) ? (a) : (b)
 19 #define ll long long
 20 #define eps 1e-10
 21 #define MOD 1000000007
 22 #define N 1006
 23 #define inf 1e12
 24 int n,m;
 25 vector<int> e[N];
 26 
 27 int tot;
 28 int head[N];
 29 int vis[N];
 30 int tt;
 31 int scc;
 32 stack<int>s;
 33 int dfn[N],low[N];
 34 int col[N];
 35 struct Node
 36 {
 37     int from;
 38     int to;
 39     int next;
 40 }edge[N*N];
 41 void init()
 42 {
 43     tot=0;
 44     scc=0;
 45     tt=0;
 46     memset(head,-1,sizeof(head));
 47     memset(dfn,-1,sizeof(dfn));
 48     memset(low,0,sizeof(low));
 49     memset(vis,0,sizeof(vis));
 50     memset(col,0,sizeof(col));
 51 }
 52 void add(int s,int u)//邻接矩阵函数
 53 {
 54     edge[tot].from=s;
 55     edge[tot].to=u;
 56     edge[tot].next=head[s];
 57     head[s]=tot++;
 58 }
 59 void tarjan(int u)//tarjan算法找出图中的所有强连通分支
 60 {
 61     dfn[u] = low[u]= ++tt;
 62     vis[u]=1;
 63     s.push(u);
 64     int cnt=0;
 65     for(int i=head[u];i!=-1;i=edge[i].next)
 66     {
 67         int v=edge[i].to;
 68         if(dfn[v]==-1)
 69         {
 70         //    sum++;
 71             tarjan(v);
 72             low[u]=min(low[u],low[v]);
 73         }
 74         else if(vis[v]==1)
 75           low[u]=min(low[u],dfn[v]);
 76     }
 77     if(dfn[u]==low[u])
 78     {
 79         int x;
 80         scc++;
 81         do{
 82             x=s.top();
 83             s.pop();
 84             col[x]=scc;
 85             vis[x]=0;
 86         }while(x!=u);
 87     }
 88 }
 89 bool two_sat(){
 90     
 91     for(int i=0;i<2*n;i++){
 92         if(dfn[i]==-1){
 93             tarjan(i);
 94         }
 95     }
 96     for(int i=0;i<n;i++){
 97         if(col[2*i]==col[2*i+1]){
 98             return false;
 99         }
100     }
101     return true;
102 }
103 int main()
104 {
105     while(scanf("%d%d",&n,&m)==2){
106          init();
107          for(int i=0;i<N;i++) e[i].clear();
108          while(!s.empty()){
109              s.pop();
110          }
111         int a,b,c;
112         char s[6];
113         for(int i=0;i<m;i++){
114             scanf("%d%d%d%s",&a,&b,&c,s);
115             if(s[0]=='A'){
116                 if(c==1){
117                     //e[2*a+1].push_back(2*a);
118                     //e[2*b+1].push_back(2*b);
119                     add(2*a+1,2*a);
120                     add(2*b+1,2*b);
121                 }
122                 else{
123                     //e[2*a].push_back(2*b+1);
124                     //e[2*b].push_back(2*a+1);
125                     add(2*a,2*b+1);
126                     add(2*b,2*a+1);
127                 }
128             }
129             else if(s[0]=='O'){
130                 if(c==1){
131                     //e[2*a+1].push_back(2*b);
132                     //e[2*b+1].push_back(2*a);
133                     add(2*a+1,2*b);
134                     add(2*b+1,2*a);
135                 }
136                 else{
137                     //e[2*a].push_back(2*a+1);
138                     //e[2*b].push_back(2*b+1);
139                     add(2*a,2*a+1);
140                     add(2*b,2*b+1);
141                 }
142             }
143         }
144         if(two_sat()){
145             printf("YES\n");
146         }
147         else{
148             printf("NO\n");
149         }
150     }
151     return 0;
152 }
View Code

 

转载于:https://www.cnblogs.com/UniqueColor/p/4814122.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go 语言 first argument to append must be slice

错误代码 func TestSliceGrowing(t *testing.T) {s : [4]int{1, 2, 3, 4}for i :0; i<10; i {s append(s, i)t.Log(len(s), cap(s))} }报错代码 s append(s, i)原因&#xff1a;append的第一个参数必须是切片 更正 func TestSliceGrowing(t *testing.T) {s : []int{1,…

豆瓣网静态页面

divcss网站登录注册豆瓣读书视频 音乐同城小组阅读 豆瓣FM东西更多豆瓣视频 影讯&购票电视剧排行榜 分类影评预告片 向后向前3/5正在热映全部正在热映>>即将上映 烈日灼心 4.7终结者&#xff1a;创世纪... 4.7百团大战 4.7刺客&#xff1a;聂隐娘 4.7近期热门更多影视…

C++并发编程实战(豆瓣评分5.4)

评分已说明一切&#xff0c;切勿踩坑&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 推荐的翻译 C并发编程实战 关注公众号回复【C并发编程实…

奔跑吧,兄弟

10月底的时候&#xff0c;不能忍受老婆的奚落&#xff0c;开始了我的跑步计划。 说说&#xff0c;跑步需要注意的事项&#xff0c;首先你得有双跑步鞋&#xff0c;我有一次是穿了薄底鞋跑的&#xff0c;结果&#xff0c;打满了水泡。跑步前控制饮水&#xff0c;最好在饮食后2个…

由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持

由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持 Spring和Hibernate的集成的一个要点就是对事务的支持&#xff0c;openSession、getCurrentSession都是编程式事务&#xff08;手动设置事务的提交、回滚&#xff09;中重要的对象&#xff0c;Hi…

go返回多个值和python返回多个值对比

go package mulVals_test import "testing" func returnMultiValues(n int)(int, int){return n1, n2 }func TestReturnMultiValues(t *testing.T) {// a : returnMultiValues(5)// 这里尝试用一个值接受多个返回值&#xff0c;将编译错误a, _ : returnMultiValues(…

努力学习 HTML5 (3)—— 改造传统的 HTML 页面

要了解和熟悉 HTML5 中的新的语义元素&#xff0c;最好的方式就是拿一经典的 HTML 文档作例子&#xff0c;然后把 HTML5 的一些新鲜营养充实进入。如下就是我们要改造的页面&#xff0c;该页面很简单&#xff0c;只包含一篇文章。 ApocalypsePage_Original.html&#xff0c;这是…

判断系统是大端还是小段

大端&#xff1a;高位内存存储低序字节小端&#xff1a;高位内存存储高序字节short a 0x0102&#xff0c;其中 01 高序字节&#xff0c; 02 低序字节 #include<stdio.h>int main() {union {short s;char c[sizeof(short)];} un;un.s 0x0102;if (sizeof(short) 2) {if…

C语言判断系统是32位还是64位

long 在 32 位系统中是 4 字节&#xff0c;与 int 表示范围相同&#xff0c;在 64 位系统中是 8 字节。 #include <stdio.h> #include <stdlib.h> #include <limits.h>int main() {long a INT_MAX;if (a 1 < 0) {printf("32: %ld\n", a);} e…

使用Eclipse搭建Struts2框架

本文转自http://blog.csdn.net/liaisuo/article/details/9064527 今天在Eclipse搭建了Struts2 框架&#xff0c;并完成了一个很简单的例子程序。 搭建好的全局图如下: 第一步:在http://struts.apache.org/download.cgi下载Struts2的最新版即下载Full Distribution&#xff0c;这…

autoLayout自动布局

autoLayout 有两个核心概念&#xff1a; 约束&#xff1a;就是对控件进行高度&#xff0c;宽度&#xff0c;相对位置的控制 参照&#xff1a;多个控件时&#xff0c;一个或多个控件以其中的一个为基准进行高度&#xff0c;宽度&#xff0c;位置的设置 当选择了 use auto layout…

JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能。...

主要内容&#xff1a; JDBC连接数据库步骤。一个简单详细的查询数据的例子。封装连接数据库&#xff0c;释放数据库连接方法。实现查询&#xff0c;插入&#xff0c;删除&#xff0c;更新等十一个处理数据库信息的功能。&#xff08;包括事务处理&#xff0c;批量更新等&#x…

C++学习笔记25,析构函数总是会宣布virtual

为了永远记住析构函数声明virtual----><<effective c>> 为这句话不一定对,但无需质疑的是这句话是非常实用的. 查看以下的样例: #include <iostream> #include <string> using namespace std; class B{ public:~B(){cout<<"base is dest…

各大互联网公司2014前端笔试面试题–JavaScript篇

很多面试题是我自己面试BAT亲身经历碰到的。整理分享出来希望更多的前端er共同进步吧&#xff0c;不仅适用于求职者&#xff0c;对于巩固复习js更是大有裨益。 而更多的题目是我一路以来收集的&#xff0c;也有往年的&#xff0c;答案不确保一定正确&#xff0c;如有错误或有更…

iOS:苹果企业证书通过网页分发安装app

本文转载至 http://blog.sina.com.cn/s/blog_6afb7d800101fa16.html 苹果的企业级证书发布的应用&#xff0c;是不用设备授权即可直接安装&#xff0c;并且不限设备上限。为了方便分发&#xff0c;苹果有协议实现通过网页链接直接下载安装企业级的应用。 基本的原理就是在生成企…

这道题很难

请编写一个函数&#xff0c;使其可以删除某个链表中给定的&#xff08;非末尾&#xff09;节点。传入函数的唯一参数为 要被删除的节点 。 现有一个链表 – head [4,5,1,9]&#xff0c;它可以表示为: 示例 1&#xff1a; 输入&#xff1a;head [4,5,1,9], node 5 输出&a…

设计模式学习笔记-基础知识篇

1. 设计模式的重要性 1.1 设计模式解决的是在软件过程中如何来实现具体的软件功能。实现同一个功能的方法有很多&#xff0c;哪个设计容易扩展&#xff0c;容易复用&#xff0c;松耦合&#xff0c;可维护&#xff1f;设计模式指导我们找到最优方案。 1.2 设计中往往会存在设计缺…

内心的平静就是财富本身-Cell组件-用友华表的由来-T君

时至今日&#xff0c;Cell组件仍是应用广泛的商业报表组件 作者&#xff1a;人生三毒 编者注&#xff1a;本文作者人生三毒为知名网站及网页游戏公司创始人&#xff0c;此前曾为IT类媒体资深编辑&#xff0c;见证了中国互联网早期的发展。 认识T君之前先认识的是他的软件&#…

C++实现一个http服务器

一个简单的博客后端服务器 github地址&#xff0c;持续更新 设计参考 #define MYSQLPP_MYSQL_HEADERS_BURIED #include "httplib.h" #include "rapidjson/document.h" #include <mysql/mysql.h> #include <iostream> #include <string>…

KMP算法的java实现

package com.trs.utils;public class KMPStr {/** 在KMP算法中&#xff0c;最难求的就是next函数&#xff0c;如何理解next函数是一个难题&#xff0c;特别是knext[k]&#xff0c;这里* 需要指出的是当p[i]!p[j]时&#xff0c;我们只有通过回溯将k的值逐渐减小&#xff0c;貌似…