【2-SAT】【DFS】【分类讨论】Gym - 101617K - Unsatisfying
题意:给你一张2-SAT,问你加至少几句a V b(不能用非运算)这样的语句,使得其无法全为真。
如果最开始没有左右两项都含非运算的析取表达式,则无解,因为显然你可以对每一项的不含非的那项规定为真,使得整个2-SAT成立。
由于规定了你添加的语句不能含有非运算,故添加的边一定从 非某 指向 某。
如果一开始就存在某个a,它和非a互相可达,则答案为0。
如果一开始某个非a能到达a,则答案为1;如果一开始存在某个非j,a能到达非j,并且存在某个i,i能到达非a,则答案也为1,显然可以添一条从非某指向某的边使得a和非a互相可达。
其余情况输出2。
#include<cstdio>
using namespace std;
int n,m,x[2005],y[2005];
bool can[2005*2][2005*2];
int first[2005*2],v[4005],nex[4005],e;
void AddEdge(int U,int V){
v[++e]=V;
nex[e]=first[U];
first[U]=e;
}
void dfs(int from,int U){
can[from][U]=1;
for(int i=first[U];i;i=nex[i]){
if(!can[from][v[i]]){
dfs(from,v[i]);
}
}
}
int main(){
//freopen("k.in","r",stdin);
bool flag=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
scanf("%d%d",&x[i],&y[i]);
if(x[i]<0 && y[i]<0){
flag=1;
}
}
if(!flag){
puts("-1");
return 0;
}
for(int i=1;i<=m;++i){
if(x[i]>0 && y[i]>0){
AddEdge(x[i]+n,y[i]);
AddEdge(y[i]+n,x[i]);
}
else if(x[i]>0 && y[i]<0){
AddEdge(x[i]+n,-y[i]+n);
AddEdge(-y[i],x[i]);
}
else if(x[i]<0 && y[i]>0){
AddEdge(-x[i],y[i]);
AddEdge(y[i]+n,-x[i]+n);
}
else{
AddEdge(-x[i],-y[i]+n);
AddEdge(-y[i],-x[i]+n);
}
}
for(int i=1;i<=n*2;++i){
dfs(i,i);
}
/*for(int i=1;i<=n*2;++i){
for(int j=1;j<=n*2;++j){
printf("%d ",can[i][j]);
}
puts("");
}*/
for(int i=1;i<=n;++i){
if(can[i][i+n] && can[i+n][i]){
puts("0");
return 0;
}
}
for(int i=1;i<=n;++i){
if(can[i][i+n]){
puts("1");
return 0;
}
}
for(int i=1;i<=n;++i){
if(can[n+i][i]){
bool f1=0;
for(int j=1;j<=n;++j){
if(can[i][j+n]){
f1=1;
break;
}
}
if(f1){
bool f2=0;
for(int j=1;j<=n;++j){
if(can[j][i+n]){
f2=1;
break;
}
}
if(f2){
puts("1");
return 0;
}
}
}
}
/*for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j)if(j!=i){
if(can[j][i] && can[j][i+n] && can[i][j+n] && can[i+n][j+n]){
puts("1");
return 0;
}
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(can[i][j] && can[i][j+n]){
puts("1");
return 0;
}
}
}*/
puts("2");
return 0;
}
【2-SAT】【DFS】【分类讨论】Gym - 101617K - Unsatisfying的更多相关文章
- dp+分类讨论 Gym 101128E
题目链接:http://codeforces.com/gym/101128 感觉这个人写的不错的(我只看了题目大意):http://blog.csdn.net/v5zsq/article/detail ...
- 【树链剖分】【dfs序】【LCA】【分类讨论】Codeforces Round #425 (Div. 2) D. Misha, Grisha and Underground
一棵树,q次询问,每次给你三个点a b c,让你把它们选做s f t,问你把s到f +1后,询问f到t的和,然后可能的最大值是多少. 最无脑的想法是链剖线段树……但是会TLE. LCT一样无脑,但是少 ...
- HDU 6665 Calabash and Landlord (分类讨论)
2019 杭电多校 8 1009 题目链接:HDU 6665 比赛链接:2019 Multi-University Training Contest 8 Problem Description Cal ...
- CF629E Famil Door and Roads【树上计数+分类讨论】
Online Judge:Codeforces629E,Luogu-CF629E Label:树上计数,分类讨论,换根 题目描述 给出一棵n个节点的树.有m个询问,每一个询问包含两个数a.b,我们可以 ...
- Codeforces 521E - Cycling City(点双连通分量+分类讨论)
Codeforces 题面传送门 & 洛谷题面传送门 大家都是暴力找生成树然后跳路径,代码不到 50 行(暴论)的一说--好,那本蒟蒻决定提供一种代码 150 行,但复杂度也是线性的分类讨论做 ...
- Codeforces 460D Little Victor and Set --分类讨论+构造
题意:从区间[L,R]中选取不多于k个数,使这些数异或和尽量小,输出最小异或和以及选取的那些数. 解法:分类讨论. 设选取k个数. 1. k=4的时候如果区间长度>=4且L是偶数,那么可以构造四 ...
- BZOJ-1067 降雨量 线段树+分类讨论
这道B题,刚的不行,各种碎点及其容易忽略,受不鸟了直接 1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2859 ...
- UVaLive 6862 Triples (数学+分类讨论)
题意:给定一个n和m,问你x^j + y^j = z^j 的数量有多少个,其中0 <= x <= y <= z <= m, j = 2, 3, 4, ... n. 析:是一个数 ...
- 枚举(分类讨论):BZOJ 1177: [Apio2009]Oil
1177: [Apio2009]Oil Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1477 Solved: 589[Submit] Descri ...
随机推荐
- ES6核心,值得驻足花一天时间来学习
1.let 和 const 命令 在es5时,只有两种变量声明,var 和function.在es6中新增了四种let和const,以及另外两种声明import和class. 我们先讲解let和con ...
- NYOJ 2 括号配对问题 (模拟)
题目链接 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S ...
- 天梯赛 L2-006 树的遍历 (二叉树)
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(<=30),是二叉树中结点的个数.第二行给出其后序遍历序 ...
- python-num18 - django进阶一
一.深入django的路由系统 下面为django的请求生命周期 下面来看下整个生命周期中的路由系统: 在Django的urls中我们可以根据一个URL对应一个函数名来定义路由规则如下: " ...
- 前端bootstrap框架禁用响应式的方法
在Bootstrap中极其重要的一个技术内容便是响应式布局了,一次编码针对不同设备终端的强大能力使得响应式技术愈发流行. 不过正所谓“萝卜青菜各有所爱”,如果你想要使用Bootstrap开发自己的项目 ...
- MacOS Safari 中 button 不能使用 text-gradient
@mixin text-gradient ($deg: 90deg, $from: $gradientFrom, $to: $gradientEnd) { background-image: line ...
- Python3 re模块正则表达式中的re.S
在Python的正则表达式中,有一个参数为re.S.它表示"."(不包含外侧双引号,下同)的作用扩展到整个字符串,包括"\n".看如下代码: import re ...
- Deep Learning基础--Softmax求导过程
一.softmax函数 softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类! 假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个 ...
- ftp--vsftp\pureftpd
FTP是File Transfer Protocol(文件传输协议),用于Internet上的控制文件的双向传输. 现今常用在一个局域网内,如学校.公司等一个指定范围的区域.(因为太过于简单和不安全) ...
- CentOS7 安装python库(numpy、scipy、matplotlib、scikit-learn、tensorflow)
0.1准备工作 安装好CentOS7,配置好网络,确保网络畅通. 0.2root授权 首先:当前用户为kaid # vim /etc/sudoers 在root ALL=(ALL) ALL之后添加: ...