题意:

不说了..典型的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常用建图法]的更多相关文章

  1. poj 3678 Katu Puzzle(Two Sat)

    题目链接:http://poj.org/problem?id=3678 代码: #include<cstdio> #include<cstring> #include<i ...

  2. 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 ...

  3. POJ 3678 Katu Puzzle(2-SAT,合取范式大集合)

    Katu Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9987   Accepted: 3741 Descr ...

  4. POJ 3678 Katu Puzzle (2-SAT)

                                                                         Katu Puzzle Time Limit: 1000MS ...

  5. POJ 3678 Katu Puzzle(强连通 法)

    题目链接 题意:给出a, b, c 和操作类型 (与或异或),问是否满足所有的式子 主要是建图: 对于 and , c == 1: 说明 a 和 b都是1,那么 0 就不能取, a' -> a ...

  6. POJ 3678 Katu Puzzle (2-SAT,常规)

    题意:给出n个点,每个点上有一个数字可以0或1,然后给出m条限制,要求a和b两个点上的数字满足 a op b = c,op和c都是给定.问是否能够有一组解满足所有限制?(即点上的数字是0是1由你决定) ...

  7. POJ 1386 Play on Words(单词建图+欧拉通(回)路路判断)

    题目链接:http://poj.org/problem?id=1386 题目大意:给你若干个字符串,一个单词的尾部和一个单词的头部相同那么这两个单词就可以相连,判断给出的n个单词是否能够一个接着一个全 ...

  8. POJ 2226 Muddy Fields 二分图(难点在于建图)

    题意:给定一个矩阵和它的N行M列,其中有一些地方有水,现在有一些长度任意,宽为1的木板,要求在板不跨越草,用一些木板盖住这些有水的地方,问至少需要几块板子? 思路:首先想到如果没有不准跨越草的条件则跟 ...

  9. poj 1149 PIGS【最大流经典建图】

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18727   Accepted: 8508 Description ...

随机推荐

  1. 2014第11周一word样式

    今天摸索使用了word的样式替换功能感觉不错,简单记录下: 1.将某一个样式的标题统一替换为另一样式,之前一般是格式化一个个找到标题设置格式, 今天才发现可以选中标题->在浮动框上单击样式或开始 ...

  2. C++字符串之一(字符表示)

    在C++中有两种类型可以用于表示字符,char和wchar_t. 但是字符串格式的标准却有很多种,如ASCII,UTF8,UTF16,UTF32等等.字符串的格式和char/wchar_t 的关系是什 ...

  3. A Guide to the Multiboot Process

    A Guide to the Multiboot Process The XP and Vista boot process in general.The Windows dual and multi ...

  4. wamp 虚拟目录的设置(转载)

    现在先来配置虚拟主机:1.先打开apache的配置文件httpd.conf,并去掉#Include conf/extra/httpd-vhosts.conf前面的#!!2.打开apache的apach ...

  5. html系列教程--文本格式化

    <b>定义粗体文本</b> <br /> <strong>定义加重语气</strong> <br /> <big>定 ...

  6. 最大稳定极值区域(MSER)检测

    http://blog.csdn.net/zizi7/article/details/50379973 http://www.cnblogs.com/dawnminghuang/p/3779552.h ...

  7. alimama open source mdrill启动后访问蓝鲸任务时出错:Caused by:org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss

    启动后,访问:http://IP:1107/mdrill.jsp  蓝鲸任务

  8. 对List对象按照某个成员变量进行排序

    /** * 对List对象按照某个成员变量进行排序 * @param list List对象 * @param sortField 排序的属性名称 * @param sortMode 排序方式:ASC ...

  9. MySql5.6Window超详细安装教程(msi 格式的安装)

    转自:红黑联盟  http://www.2cto.com/database/201506/409821.html 一.安装包准备 1.下载MySql5.6 http://www.mysql.com/ ...

  10. JAVA 初识类加载机制 第13节

    JAVA 初识类加载机制 第13节 从这章开始,我们就进入虚拟机类加载机制的学习了.那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要编译成.class文件,再由虚拟机 ...