算法复习——2—sat(bzoj2199)
题目:
Description
Input
Output
Sample Input
1 Y 2 N
1 N 2 N
1 Y 3 Y
1 Y 2 Y
Sample Output
HINT
Source
题解:
2-sat问题的模板题目,先说2-sat问题的基本解法:
一些问题可以转成布尔方程来求解····
我们的目的是将其布尔方程的每个文字拆开成两点,一点表示其本身,一点表示它的非,比如a就拆成a与┐a,并且将各种运算符号转化为只含有^(与)和->(A->B表示A为真则B为真)的形式,比如∨转化为┐a -> b ^ ┐b -> a ,a一定为真就转换为 ┐a->a 的形式,然后将->转换成边,两边连上对应的点。
如果a与┐a在最后建成的图的同一个强连通分量里···那么布尔方程有解
如果a所在强连通分量的拓扑序在┐a所在强连通分量的拓扑序之后,那么a为真,之前a为假,如果相等则真假均可以取。这里求拓扑序直接用tarjian即可,先找到的强连通分量的拓扑序一定更大
以上就是基本知识
但这道题有点特殊·····因为包含a拓扑序与┐a相等的情况要判断····用tarjian的话有点麻烦···
但n很小···直接dfs即可····若a可以到达┐a,则说明a可能与┐a在同一强连通分量或者a所在强连通分量的拓扑序小于等于┐a的拓扑序
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=;
const int M=;
int first[N],next[M],go[M],tot=,n,m;
bool visit[N];
inline void comb(int a,int b)
{
next[++tot]=first[a],first[a]=tot,go[tot]=b;
}
inline int tran(int a)
{
return (a%==)?a+:a-;
}
inline int R()
{
char c;
int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar())
f=(f<<)+(f<<)+c-'';
return f;
}
inline void dfs(int u)
{
visit[u]=true;
for(int e=first[u];e;e=next[e])
{
if(!visit[go[e]])
dfs(go[e]);
}
}
inline bool jud(int u)
{
memset(visit,false,sizeof(visit));
dfs(u);
if(!visit[tran(u)]) return true;
else return false;
}
int main()
{
//freopen("a.in","r",stdin);
n=R(),m=R();
char s[],t[];
int a,b;
for(int i=;i<=m;i++)
{
scanf("%d%s%d%s",&a,s,&b,t);
int t1,t2;
if(s[]=='Y')
t1=a*-;
else
t1=a*;
if(t[]=='Y')
t2=b*-;
else
t2=b*;
comb(tran(t2),t1);
comb(tran(t1),t2);
}
for(int i=;i<=n;i++)
{
bool flag1=jud(i*-);
bool flag2=jud(i*);
if(!flag1&&!flag2) {cout<<"IMPOSSIBLE"<<endl;return ;}
else if(!flag1) cout<<"N";
else if(!flag2) cout<<"Y";
else cout<<"?";
}
return ;
}
算法复习——2—sat(bzoj2199)的更多相关文章
- C#冒泡算法复习
C#冒泡算法复习 冒泡算法的意思:每一趟找到一个最小或最大的数放到最后面,比较总数的n-1次(因为比较是2个双双比较的) 第一层循环表示进行比较的次数,总共要比较(数的)-1次 (因为比较是2个双双比 ...
- C语言排序算法复习
排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔 ...
- KMP算法复习【+继续学习】
离NOIP还剩12天,本蒟蒻开始准备复习了. 先来个KMP[似乎我并没有写过KMP的blog] KMP KMP算法是解决字符串匹配问题的一个算法,主要是单对单的字符串匹配加速,时间复杂度O(m + n ...
- 算法复习周------“动态规划之‘最长公共子序列’”&&《计蒜课》---最长公共子串题解
问题描述: 这个问题其实很容易理解.就是给你两个序列X={x1,x2,x3......xm} Y={y1,y2,y3......ym},要求找出X和Y的一个最长的公共子序列. 例:Xi={A, B, ...
- 算法复习-P NP NPC NP-hard概念
from http://blog.csdn.net/huang1024rui/article/details/49154507 P.NP.NPC和NP-Hard相关概念的图形和解释 一.相关概念 P: ...
- K-Means聚类和EM算法复习总结
摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 k-means算法是一种得到最广泛使用的聚类算法. 它是将各个聚类子集内 ...
- 通过“回文字算法”复习C++语言。
一.什么是回文字 给定一个字符串,从前往后读和从后往前读,字符串序列不变.例如,河北省农村信用社的客服电话是“96369”,无论从后往前读,还是从前后往后读,各个字符出现的位置不变. 二.功能实现 ( ...
- 【转】常用算法复习及实现(C++版)
一.霍夫曼树实现 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree).哈夫曼树是带权路径长度最短的树,权值较大 ...
- OI算法复习
搜集一些算法,赛前背一背有好处的 转自各大网站 前排感谢:hzwer.风了咕凉 前辈...Orz 快速读入: int read() { ,f=;char ch=getchar(); ;ch=getch ...
随机推荐
- C# 操作字符串,在某些特定的字符后面或前面添加其它字符
C# 操作字符串,在某些特定的字符后面或前面添加其它字符,解决方法: 字符串替换或正则表达式替换即可. 示例:实现的是在每个“第”前面添加一个逗号,在每个“方案”后面添加一个冒号. string s ...
- codeforces Gym 100338E Numbers (贪心,实现)
题目:http://codeforces.com/gym/100338/attachments 贪心,每次枚举10的i次幂,除k后取余数r在用k-r补在10的幂上作为候选答案. #include< ...
- 什么是闭包(Closure)?
http://kb.cnblogs.com/page/111780/ 这个问题是在最近一次英格兰Brighton ALT.NET Beers活动中提出来的.我发现,如果不用代码来演示,你很难单用话语把 ...
- 工程化---cnpm不是内部命令的解决
(1)问题描述 安装完,执行cnpm -v发现报出不是内部命令. 安装成功如下图: (2)解决方案: 之前配置过默认安装都会在D:\\nodejs\node_global中,所有我们cd 到 这个路径 ...
- ubuntu 升级到5.1kernel,打开bbr
apt-get -f install wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.1/linux-headers-5.1.0-0 ...
- 给 MSYS2 添加国内源
https://wiki.qt.io/MSYS2pacman -S base-devel git mercurial svn wget p7zip软件包 开发包 http://mirrors.ustc ...
- CS193p Lecture 5 - View Controller Lifecycle
1. UITextView @property(nonatomic,readonly,retain) NSTextStorage *textStorage 是 NSMutableAttributedS ...
- 268. Missing Number@python
Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...
- js的工厂模式
工厂模式: 什么叫工厂模式,工厂就是大家大脑里想的那样,一个流水线作业的一个东西,只需要满足刚需就可以了,一个人,只干一件事,最后串起来,就是一个事件. 首先需要说一下工厂模式.工厂模式根据抽象程度的 ...
- 使用Fiddler抓取IOS_APP的请求
首先在地址https://www.telerik.com/fiddler 下载我们需要的fiddler 在新窗口中写上一些信息然后点击[Download for Windows]进行下载: 安装成功后 ...