算法复习——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 ...
随机推荐
- Memcache笔记01-Memcache的安装
memcached是什么? Memcached是一个高性能的分布式的内存对象缓存系统,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力,通过在内存里维护一个统一的巨大的has ...
- codevs 3344 迷宫
时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 小刚在迷宫内,他需要从A点出发,按顺序经过B,C,D……,到达最后一个点,再回到A ...
- 使用ABAP编程实现对微软Office Word文档的操作
SAP ABAP里提供了一个标准的类CL_DOCX_DOCUMENT,提供了本地以".docx"结尾的微软Office word文档的读和写操作. 本文介绍了ABAP类CL_DOC ...
- idea快速生成实体类Entity
1)打开idea 2)添加mysql的数据连接 3)生成类
- vc生产垃圾清理
@echo off echo 清除所有obj pch idb pdb ncb opt plg res sbr ilk suo文件,请稍等...... pause del /f /s /q .\*.ob ...
- mac系统下android studio创建手机模拟器
打开android studio,点击右上角的模拟器图标,打开“Android Virtual Device Manager” 窗口,如下图 点击“Create Virtual Device”,在 ...
- Core Animation演示
相关代码展示: - (IBAction)toggleRoundCorners:(id)sender { [CATransaction setDisableActions:![_enableAnimat ...
- vue 点击倒计时 ajax 封装
方法:function(){ var that = this; if (that.time == 0) { that.disabled = false; that.text ="点击获取&q ...
- Qt读写excel
今天在利用Qt进行excel操作时,代码总是走到打开excel这一步是总是出现程序崩溃.在网上查找了各种帖子 说法不一,尝试都没有解决.后来猜想是不是excel没有激活影响的.发现自己的excel没 ...
- python 删除大表数据
#!/usr/bin/env python # encoding: utf-8 #@author: 东哥加油! #@file: del_tb_bigtable_statistic.py #@time: ...