poj3678 2- sat
这题就是找合取范式比较麻烦
AND 1 0必须取自己来造成矛盾,1必须取1
AND 0 1必须取0
OR 1 0必须取1
OR 0 1必须取自己来造成矛盾
XOR 1 0必须取1,1必须取0
XOR 0 1必须取1,0必须取0
然后就是tarjan扫一遍判断
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f; stack<int>s;
vector<int>v[N];
int ins[N],inans[N];
int dfn[N],low[N];
int num,index;
void tarjan(int u)
{
ins[u]=;
dfn[u]=low[u]=++index;
s.push(u);
for(int i=;i<v[u].size();i++)
{
int x=v[u][i];
if(!dfn[x])
{
tarjan(x);
low[u]=min(low[u],low[x]);
}
else if(ins[x]==)low[u]=min(low[u],dfn[x]);
}
if(dfn[u]==low[u])
{
++num;
while(!s.empty()){
int k=s.top();
s.pop();
ins[k]=;
inans[k]=num;
if(k==u)break;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
int n,m;
cin>>n>>m;
memset(ins,,sizeof ins);
memset(inans,,sizeof inans);
memset(dfn,,sizeof dfn);
memset(low,,sizeof low);
num=index=;
while(!s.empty())s.pop();
for(int i=;i<*n;i++)v[i].clear();
while(m--){
int a,b,c;
string s;
cin>>a>>b>>c>>s;
if(s[]=='A')
{
if(c)
{
v[a].push_back(a+n);
v[b].push_back(b+n);
v[a+n].push_back(b+n);
v[b+n].push_back(a+n);
}
else
{
v[a+n].push_back(b);
v[b+n].push_back(a);
}
}
else if(s[]=='O')
{
if(c)
{
v[a].push_back(b+n);
v[b].push_back(a+n);
}
else
{
v[a].push_back(b);
v[b].push_back(a);
v[a+n].push_back(a);
v[b+n].push_back(b);
}
}
else
{
if(c)
{
v[a].push_back(b+n);
v[b].push_back(a+n);
v[a+n].push_back(b);
v[b+n].push_back(a);
}
else
{
v[a].push_back(b);
v[b].push_back(a);
v[a+n].push_back(b+n);
v[b+n].push_back(a+n);
}
}
}
for(int i=;i<*n;i++)
if(!dfn[i])
tarjan(i);
bool f=;
for(int i=;i<n;i++)
if(inans[i]==inans[i+n])
{
f=;
break;
}
if(f)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
return ;
}
/******************** ********************/
poj3678 2- sat的更多相关文章
- 学习笔记(two sat)
关于two sat算法 两篇很好的论文由对称性解2-SAT问题(伍昱), 赵爽 2-sat解法浅析(pdf). 一些题目的题解 poj 3207 poj 3678 poj 3683 poj 3648 ...
- 多边形碰撞 -- SAT方法
检测凸多边形碰撞的一种简单的方法是SAT(Separating Axis Theorem),即分离轴定理. 原理:将多边形投影到一条向量上,看这两个多边形的投影是否重叠.如果不重叠,则认为这两个多边形 ...
- 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 ...
- Map Labeler POJ - 2296(2 - sat 具体关系建边)
题意: 给出n个点 让求这n个点所能建成的正方形的最大边长,要求不覆盖,且这n个点在正方形上或下边的中点位置 解析: 当然是二分,但建图就有点还行..比较难想..行吧...我太垃圾... 2 - s ...
- LA 3211 飞机调度(2—SAT)
https://vjudge.net/problem/UVALive-3211 题意: 有n架飞机需要着陆,每架飞机都可以选择“早着陆”和“晚着陆”两种方式之一,且必须选择一种,第i架飞机的早着陆时间 ...
- HIT 1917 2—SAT
题目大意:一国有n个党派,每个党派在议会中都有2个代表, 现要组建和平委员会,要从每个党派在议会的代表中选出1人,一共n人组成和平委员会. 已知有一些代表之间存在仇恨,也就是说他们不能同时被选为和平委 ...
- hdu 4421 和poj3678类似二级制操作(2-sat问题)
/* 题意:还是二进制异或,和poj3678类似 建边和poj3678一样 */ #include<stdio.h> #include<string.h> #include&l ...
- 2 - sat 模板(自用)
2-sat一个变量两种状态符合条件的状态建边找强连通,两两成立1 - n 为第一状态(n + 1) - (n + n) 为第二状态 例题模板 链接一 POJ 3207 Ikki's Story IV ...
- SAT考试里最难的数学题? · 三只猫的温暖
问题 今天无意中在Quora上看到有人贴出来一道号称是SAT里最难的一道数学题,一下子勾起了我的兴趣.于是拿起笔来写写画画,花了差不多十五分钟搞定.觉得有点意思,决定把解题过程记下来.原帖的图太小,我 ...
- 世界碰撞算法原理和总结(sat gjk)
序言 此文出于作者的想法,从各处文章和论文中,总结和设计项目中碰撞结构处理方法.如有其它见解,可以跟作者商讨.(杨子剑,zijian_yang@yeah.net). 在一个世界中,有多个物体,物体可以 ...
随机推荐
- 面向对象 - 1.面向过程/2.面向对象/3.如何使用类/4.__init__方法/5.属性查找/6.补充知识/7.可扩展性高
编程范式(流派): 面向对象编程,面向过程编程 各有用处!! 编程:语法+数据结构(list dict)+算法(逻辑)-----------------------------------1.面向过程 ...
- Activity # runOnUiThread 与 View # post
There is no real difference, except that the View.post is helpful when you don't have a direct acces ...
- PyNest——part 3: connecting networks with synapses
part 3: connecting networks with synapses parameterising synapse models NEST提供了各种不同的突触模型. 您可以使用命令nes ...
- http的请求流程
# !/usr/bin/env python # coding:utf-8 import socket def handle_request(client): buf = client.recv(10 ...
- Matplot相关(二)——统计图
Matplotlib:其能够支持所有的2D作图和部分3D作图.能通过交互环境做出印刷质量的图像. ————————缩写定义———————— import matplot.pyplot as plt — ...
- Nodejs学习计划
此文章已经发表于本人博客. 由于公司要求这段时间在学习Nodejs,基本靠自摸一路走来踩了很多坑浪费很多时间,今天就来这里说下,顺便计划一下接下来的学习计划,目前自己做个博客,项目过程中学习了js类以 ...
- replace限制文本框只能输入数字,数字和字母等的正则表达式
1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'')" onafte ...
- 微信小程序学习笔记(7)--------布局基础
ui布局基础 一.flex布局 1.flex的容器和元素 2.flex容器属性详解 1>flex-direction不仅设置元素的排列方向,还设置主轴和交叉轴如下图主轴是由上到下 2&g ...
- Levenshtein距离
Levenshtein Distance,又称Edit Distance,在自然语言处理中有着广泛的应用.Levenshtein Distance 指的是两个字符串之间,由一个转换成另一个所需的最少 ...
- 【Flask】WTForms基本使用
# WTForms笔记:这个库一般有两个作用.第一个就是做表单验证,把用户提交上来的数据进行验证是否合法.第二个就是做模版渲染. ### 做表单验证:1. 自定义一个表单类,继承自wtforms.Fo ...