poj 3678 XOR和OR和AND(简单2-sat问题)
/*
题意:给你一些边,每条边有一个值和一个运算符XOR OR AND求是否存在一些点使得所有的边根据这些运算符
可以符合条件的权值.
建边方式参考:http://blog.csdn.net/shuangde800/article/details/8876533
这种建边方式真好,以后就用这种了
0 -- 1
0 -- 0
1 -- 0
1 -- 1
根据预算符有矛盾就建两条边
因为这题中的c只有两种取值0,1,所以只需要计算一次就可以了
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define N 2100
#define NN 1100000
struct node
{
int u,v,w,next;
char s[5];
} bian[NN*8];
int head[N],yong,low[N],dfn[N],belong[N],ans,top,index,stac[N],vis[N];
void init()
{
memset(head,-1,sizeof(head));
yong=index=ans=top=0;
memset(vis,0,sizeof(vis));
memset(dfn,0,sizeof(dfn));
}
void addedge(int u,int v)
{
bian[yong].v=v;
bian[yong].next=head[u];
head[u]=yong++;
}
void tarjan(int u)
{
low[u]=dfn[u]=++index;
stac[++top]=u;
vis[u]=1;
int i;
for(i=head[u]; i!=-1; i=bian[i].next)
{
int v=bian[i].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
ans++;
int t;
do
{
t=stac[top--];
belong[t]=ans;
vis[t]=0;
}
while(t!=u);
}
}
int slove(int n)
{
int i;
for(i=0; i<n*2; i++)
if(!dfn[i])
tarjan(i);
// printf("%d\n",ans);
for(i=0; i<n; i++)
if(belong[i]==belong[i+n])
return 0;
return 1;
}
int main()
{
int n,m,i,u,v,w;
char s[5];
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
for(i=0; i<m; i++)
{
scanf("%d%d%d%s",&u,&v,&w,s);
if(strcmp(s,"AND")==0)
{
if(w)
{
addedge(u,v);
addedge(v+n,u+n);//1,0
addedge(u+n,v+n);
addedge(v,u);//0,1
addedge(u+n,v);
addedge(v+n,u);//0,0
}
else
{
addedge(u,v+n);
addedge(v,u+n);
}
}
if(strcmp(s,"OR")==0)
{
if(w)
{
addedge(u+n,v);
addedge(v+n,u);
}
else
{
addedge(u,v);
addedge(v+n,u+n);//1,0
addedge(u+n,v+n);
addedge(v,u);//0,1
addedge(u,v+n);
addedge(v,u+n);//1,1
}
}
if(strcmp(s,"XOR")==0)
{
if(w)
{
addedge(u+n,v);
addedge(v+n,u);//0,0
addedge(u,v+n);
addedge(v,u+n);//1,1
}
else
{
addedge(u,v);
addedge(v+n,u+n);//1,0
addedge(u+n,v+n);
addedge(v,u);//0,1
}
}
}
if(slove(n))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
poj 3678 XOR和OR和AND(简单2-sat问题)的更多相关文章
- POJ 3678 Katu Puzzle(2-SAT,合取范式大集合)
Katu Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9987 Accepted: 3741 Descr ...
- HDU 3062 && HDU 1824 && POJ 3678 && BZOJ 1997 2-SAT
一条边<u,v>表示u选那么v一定被选. #include <iostream> #include <cstring> #include <cstdio> ...
- 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 强连通分量 tarjan
http://poj.org/problem?id=3678 给m条连接两个点的边,每条边有一个权值0或1,有一个运算方式and.or或xor,要求和这条边相连的两个点经过边上的运算后的结果是边的权值 ...
- 基础但是很重要的2-sat POJ 3678
http://poj.org/problem?id=3678 题目大意:就是给你n个点,m条边,每个点都可以取值为0或者1,边上都会有一个符号op(op=xor or and三种)和一个权值c.然后问 ...
- poj 3678 Katu Puzzle(Two Sat)
题目链接:http://poj.org/problem?id=3678 代码: #include<cstdio> #include<cstring> #include<i ...
- POJ 3678 Katu Puzzle (2-SAT)
Katu Puzzle Time Limit: 1000MS ...
- poj 3678(SCC+2-SAT)
传送门:Problem 3678 https://www.cnblogs.com/violet-acmer/p/9769406.html 难点: 题意理解+构图 题意: 有n个点 v[0,2..... ...
- POJ 3678 Katu Puzzle (经典2-Sat)
Katu Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6553 Accepted: 2401 Descr ...
随机推荐
- dangerouslySetHTML 和 style 属性
这一节我们来补充两个之前没有提到的属性,但是在 React.js 组件开发中也非常常用,但是它们也很简单. dangerouslySetHTML 出于安全考虑的原因(XSS 攻击),在 React.j ...
- new几种用法
在 C# 中,new 关键字可用作运算符.修饰符或约束. new 运算符 用于创建对象和调用构造函数. new 修饰符 用于向基类成员隐藏继承成员. new 约束 用于在泛型声明中约束可能用作类型参数 ...
- const和volatile
const是只读变量 const修饰的变量是只读的,其本质还是变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在全局数据区分配空间 const只在编译期有用,在运行期无用 con ...
- 混合开发之DCloud和Weex的集成及优缺点比较
记录此文时太忙,没时间整理上来.需要请私信,由于DCloud和Weex的版本及API更新过快,本次分享只是对某个版本处理.
- life of a NPTL pthread
这是2013年写的一篇旧文,放在gegahost.net上面 http://raison.gegahost.net/?p=91 March 7, 2013 life of a NPTL pthread ...
- 使用JavaScript将当前页面保存成PDF,支持图片和文字的保存
前端开发的朋友们可能会遇到这个需求:将您负责开发的网页的全部内容,包括文字和图片,一起保存成一个PDF文件.如果采用屏幕截图的话,默认Windows操作系统的截图按钮无法完整截取超过一屏幕的屏幕内容. ...
- poptip 外面 放 input 使用 iview vue
外层套的是 <FormItem prop="name" label="姓名:"> <Input v-model="tFill.nam ...
- easyUI-datagrid属性设置display:none,表头不显示
<div class="box1"> <div class="dg1Box" style="margin-top:15px; mar ...
- 完整卸载MySQL数据库
1. 关掉mysql服务 右键“我的电脑”,选择“管理”,打开计算机管理,选择“服务” 右键MySQL服务,选择“停止” 2. 卸载mysql程序 开始菜单->控制面板->程序和功能 3. ...
- python爬虫---从零开始(一)初识爬虫
我们开始来谈谈python的爬虫. 1,什么是爬虫: 网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫.互联网犹如一个大蜘蛛 ...