题意:

不说了..典型的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. mssql中得到当天数据的语句

    一条例子: 关键语句:

  2. Guava缓存器源码分析——缓存统计器

    Guava缓存器统计器实现: 全局统计器——         1.CacheBuilder的静态成员变量Supplier<StatsCounter> CACHE_STATS_COUNTER ...

  3. How to use pagination in Magento

    classYour_Module_Block_Entityname_ListextendsMage_Core_Block_Template { protected function _construc ...

  4. JQuery日记6.9 Promise/A之Callbacks

    JQuery并没有简单的使用一个Array来存储回调函数,而是通过JQuery.Callbacks(options)返回一个self对象,此对象能够动态的add,remove和fire回调函数队列.此 ...

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

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

  6. 20160125--Spring

    package com.hanqi; import java.util.*; import com.hanqi.User; public class HelloWorld { public Hello ...

  7. 20151225--easyUI

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  8. 浅谈树链剖分(C++、算法、树结构)

    关于数链剖分我在网上看到的有几个比较好的讲解,本篇主要是对AC代码的注释(感谢各位witer的提供) 这是讲解 http://www.cnblogs.com/kuangbin/archive/2013 ...

  9. JVM学习之堆和栈

    Java栈与堆 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快, ...

  10. web.xml加载顺序详解

    一. 1.启动tomcat启动web项目,首先读取web.xml文件中<context-param>和<listener> 2.容器创建一个ServletContext(ser ...