[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 ...
随机推荐
- qt运行库
KERNEL32.DLL MINGWM10.DLL MSVCRT.DLL LIBGCC_S_DW2-1.DLL QTCORE4.DLL QTGUI4.DLL 笔者安装的是QT SDK.(发行版本这是前 ...
- CC++初学者编程教程(4) 安装Oracle12c于Windows Sever2012
我们开启虚拟机 Windows Sever2012启动中. 3.看到WindowsSever2012的桌面. 我们解压缩两个文件, winx64_12c_database_1of2.zip,winx6 ...
- iOS第三方库-CocoaLumberjack-DDLog (转)
原文:http://blog.sina.com.cn/s/blog_7b9d64af0101kkiy.html 发现一个,很厉害的小工具,让xCode控制台输出文本有颜色! 闲话不说,上代码. 大概需 ...
- Shortest Path(思维,dfs)
Shortest Path Accepts: 40 Submissions: 610 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: ...
- Cow Sorting(置换群)
Cow Sorting Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6664 Accepted: 2602 Descr ...
- 你必须知道的 34 个简单实用的 Ubuntu 快捷键
ubuntu常用的快捷键: 1. Ctrl + W: 关闭当前 Nautilus 窗口 2. Ctrl+T: 在 Nautilus 打开新的 Tab 3. Ctrl + H: 切换隐藏文件(夹)显 ...
- ShareSDK的简化压缩和使用样例
share sdk 太大了 于是自己 開始简化, 删除了 ipad 的图片和 framework , 压缩了 sharesdk 中的 图片,用几k的图片 替换了几个 200多k 的图片 仅仅保留 ...
- 如何修改 UINavigationController、UINavigationBar 中 navigationItem 左侧 “返回” 按钮的名称
如果我们从 title 为 “首页” 的页面 A 点击进入一个子页面 B,那么在页面 B 的左上角将显示一个名为 “<首页” 的按钮.假设这个页面 A 叫 “你是我天边最美的云彩”,那在页面 B ...
- 你想不到的压缩方法:将javascript文件压缩成PNG图像存储
这样可以做到很高的压缩比,到底有多高,下面会提到.这种方法用到了 canvas 控件,这也意味着只有支持 canvas 控件的浏览器下才有效. 现在你可以看到,上面的图像类似一个噪声图像,但它实际上是 ...
- ASP.NET MVC 学习之路-1
本文在于巩固基础 学习参考书籍:ASP.NET MVC4 Web编程 首先确定我们学习MVC的目标: 我们学习ASP.NET MVC的目的在于开发健壮的.可维护的Web应用,当然这需要一定的知识基础, ...