[poj 3678]Katu Pazzle[2-SAT常用建图法]
题意:
不说了..典型的2-SAT
常用模型:
重点:
突出"绑定性".
连线表示限制而非可行. 因为最后要求对立点不在同一强连通分量是说同一强连通中的点必须同时选.
坑:
首先是算法记错了...inq是求SPFA用的...
Tarjan中也少了个灰色点黑色点的判断(本身算是查漏补缺吧, 以后检查的时候首先还是看看模板有没有背错)...
分身点加的是点的个数.
异或0的那个判断粗心了...
还是默认多组样例吧...
#include <cstdio>
#include <cstring>
#include <stack>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
const int MAXN = 1005;
const int MAXE = 1000005;
struct pool
{
int v,pre;
} p[MAXE<<2];
int n,m;
int head[MAXN<<1],num,dfn[MAXN<<1],low[MAXN<<1],id[MAXN<<1],size,Index;
bool used[MAXN<<1];
stack<int> s;
void clear()
{
memset(head,0,sizeof(head));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(used,false,sizeof(used));
while(!s.empty()) s.pop();
num = Index = size = 0;
} void add(int u, int v)
{
p[++num].v = v;
p[num].pre = head[u];
head[u] = num;
} void build(int u, int v, bool c, string s)
{
if(s=="AND")
{
if(c)
{
add(u+n,u);
add(v+n,v);
}
else
{
add(u,v+n);
add(v,u+n);
}
}
else if(s=="OR")
{
if(c)
{
add(u+n,v);
add(v+n,u);
}
else
{
add(u,u+n);
add(v,v+n);
}
}
else
{
if(c)
{
add(u,v+n);
add(v,u+n);
add(v+n,u);
add(u+n,v);
}
else
{
add(u,v);
add(u+n,v+n);
add(v,u);
add(v+n,u+n);
}
}
}
void Tarjan(int u)
{
dfn[u] = low[u] = ++Index;
used[u] = true;
s.push(u);
for(int tmp=head[u],k; k=p[tmp].v,tmp; tmp=p[tmp].pre)
{
if(!dfn[k])
{
Tarjan(k);
low[u] = min(low[u],low[k]);
}
else if(used[k]) low[u] = min(low[u],dfn[k]);//!!
}
if(dfn[u] == low[u])
{
size++;
int k;
do
{
k = s.top();
s.pop();
// printf("node = %d size = %d\n",k,size);
used[k] = false;
id[k] = size;
}
while(u!=k);
}
} int main()
{
while(scanf("%d %d",&n,&m)==2)
{
string s;
bool c;
clear();
for(int i = 0,u,v; i<m; i++)
{
cin>>u>>v>>c>>s;
build(u,v,c,s);
}
for(int i=0; i<n<<1; i++) //每一种状态都要试一遍
{
if(!dfn[i])
Tarjan(i);
}
bool flag = true;
for(int i=0; i<n; i++)
if(id[i]==id[i+n])
{
flag = false;
// printf("and %d\n",i);
break;
}
if(flag) printf("YES\n");
else printf("NO\n");
}
}
[poj 3678]Katu Pazzle[2-SAT常用建图法]的更多相关文章
- poj 3678 Katu Puzzle(Two Sat)
题目链接:http://poj.org/problem?id=3678 代码: #include<cstdio> #include<cstring> #include<i ...
- 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 ...
- POJ 3678 Katu Puzzle(2-SAT,合取范式大集合)
Katu Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9987 Accepted: 3741 Descr ...
- POJ 3678 Katu Puzzle (2-SAT)
Katu Puzzle Time Limit: 1000MS ...
- POJ 3678 Katu Puzzle(强连通 法)
题目链接 题意:给出a, b, c 和操作类型 (与或异或),问是否满足所有的式子 主要是建图: 对于 and , c == 1: 说明 a 和 b都是1,那么 0 就不能取, a' -> a ...
- POJ 3678 Katu Puzzle (2-SAT,常规)
题意:给出n个点,每个点上有一个数字可以0或1,然后给出m条限制,要求a和b两个点上的数字满足 a op b = c,op和c都是给定.问是否能够有一组解满足所有限制?(即点上的数字是0是1由你决定) ...
- POJ 1386 Play on Words(单词建图+欧拉通(回)路路判断)
题目链接:http://poj.org/problem?id=1386 题目大意:给你若干个字符串,一个单词的尾部和一个单词的头部相同那么这两个单词就可以相连,判断给出的n个单词是否能够一个接着一个全 ...
- POJ 2226 Muddy Fields 二分图(难点在于建图)
题意:给定一个矩阵和它的N行M列,其中有一些地方有水,现在有一些长度任意,宽为1的木板,要求在板不跨越草,用一些木板盖住这些有水的地方,问至少需要几块板子? 思路:首先想到如果没有不准跨越草的条件则跟 ...
- poj 1149 PIGS【最大流经典建图】
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18727 Accepted: 8508 Description ...
随机推荐
- java--工具方法
根据时间戳得到具体的时间: public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat(& ...
- Struts2 自定义拦截器实例—登陆权限验证
实现一个登陆权限验证的功能 message.jsp: <body> message:${message } </body> login.jsp: <% request.g ...
- NULL和nullptr的区别
//error C2665: “go”: 2 个重载中没有一个可以转换所有参数类型 #include <iostream> void go(int num) { std::cout < ...
- 如何用C#把Doc文档转换成rtf格式
先在项目引用里添加上对Microsoft Word 9.0 object library的引用 using System; namespace DocConvert { class DoctoRtf ...
- Mongo散记--聚合(aggregation)& 查询(Query)
mongo官网:http://www.mongodb.org/ 工作中使用到Mongo,可是没有系统的学习研究过Mongo,仅对工作过程中,在Mongo的使用过程中的一些知识点做一下记录,并随时补充, ...
- 利用js_API 运行对html文档元素的属性的CRUD操作
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- IIS Express中如何配置支持json
今天在使用i18next的时候,由于要加载一个json的文件,但是在vs2013中一直加载不成功呢,经过上网查资料得知原来要配置iis express才能支持json文件的加载. 文件的默认位置在:C ...
- iOS技术
iOS技术 OC:分类(好处,和延展的区别) 分类: 在不修改原有的类的基础上增加新的方法 一个庞大的类可以分模块开发 一个庞大的类可以由多个人来编写,更有利于团队合作 分类是对原有类的一种扩展,在 ...
- Mongodb基础知识----Mongodb权威指南阅读
文档是Mongodb中数据的基本单元,类型关系型数据库中的行,每个文档都有一个键值唯一的键_id.集合可以看做拥有动态模式的表. Mongodb一个实例可以拥有多个相互独立的数据库. Mongodb区 ...
- leetcode Generate Parentheses python
# 解题思路:列举出所有合法的括号匹配,使用dfs.如果左括号的数量大于右括号的数量的话,就不能产生合法的括号匹配class Solution(object): def generateParenth ...