题意:给你一张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的更多相关文章

  1. dp+分类讨论 Gym 101128E

    题目链接:http://codeforces.com/gym/101128 感觉这个人写的不错的(我只看了题目大意):http://blog.csdn.net/v5zsq/article/detail ...

  2. 【树链剖分】【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一样无脑,但是少 ...

  3. HDU 6665 Calabash and Landlord (分类讨论)

    2019 杭电多校 8 1009 题目链接:HDU 6665 比赛链接:2019 Multi-University Training Contest 8 Problem Description Cal ...

  4. CF629E Famil Door and Roads【树上计数+分类讨论】

    Online Judge:Codeforces629E,Luogu-CF629E Label:树上计数,分类讨论,换根 题目描述 给出一棵n个节点的树.有m个询问,每一个询问包含两个数a.b,我们可以 ...

  5. Codeforces 521E - Cycling City(点双连通分量+分类讨论)

    Codeforces 题面传送门 & 洛谷题面传送门 大家都是暴力找生成树然后跳路径,代码不到 50 行(暴论)的一说--好,那本蒟蒻决定提供一种代码 150 行,但复杂度也是线性的分类讨论做 ...

  6. Codeforces 460D Little Victor and Set --分类讨论+构造

    题意:从区间[L,R]中选取不多于k个数,使这些数异或和尽量小,输出最小异或和以及选取的那些数. 解法:分类讨论. 设选取k个数. 1. k=4的时候如果区间长度>=4且L是偶数,那么可以构造四 ...

  7. BZOJ-1067 降雨量 线段树+分类讨论

    这道B题,刚的不行,各种碎点及其容易忽略,受不鸟了直接 1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2859 ...

  8. UVaLive 6862 Triples (数学+分类讨论)

    题意:给定一个n和m,问你x^j + y^j = z^j 的数量有多少个,其中0 <= x <= y <= z <= m, j = 2, 3, 4, ... n. 析:是一个数 ...

  9. 枚举(分类讨论):BZOJ 1177: [Apio2009]Oil

    1177: [Apio2009]Oil Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1477  Solved: 589[Submit] Descri ...

随机推荐

  1. 小程序Openid 获取,服务器 encryptedData 解密 遇到的坑

    获取客户 openId 和 unionId 需要以下步骤(都为必须步骤) 1.从验证从客户端传上来code, 获取sessionKey (需要配合小程序appid ,secret 发送到微信服务器) ...

  2. 【洛谷P1104】生日

    题目描述 cjf君想调查学校OI组每个同学的生日,并按照从大到小的顺序排序.但cjf君最近作业很多,没有时间,所以请你帮她排序. 输入输出格式 输入格式: 有2行,第1行为OI组总人数n:第2行至第n ...

  3. 多进程Process

    多进程旧式写法 from multiprocessing import Pool def f(x): return x*x if __name__ == '__main__': p = Pool(5) ...

  4. python模块之imghdr检测图片类型

    1. imghdr是什么 imghdr是一个用来检测图片类型的模块,传递给它的可以是一个文件对象,也可以是一个字节流. 能够支持的图片格式: 2. 如何使用 提供了一个api叫做imghdr.what ...

  5. Hadoop笔记之搭建环境

    Hadoop的环境搭建分为单机模式.伪分布式模式.完全分布式模式. 因为我的本本比较挫,所以就使用伪分布式模式. 安装JDK 一般Linux自带的Java运行环境都是Open JDK,我们到官网下载O ...

  6. bzoj 2653 二分答案+可持久化线段树

    首先离散化,然后我们知道如果对于一个询问的区间[l1,r1],[l2,r2],我们二分到一个答案x,将[l1,r2]区间中的元素大于等于x的设为1,其余的设为-1,那么如果[l1,r1]的最大右区间和 ...

  7. 深入理解Spring系列之十二:@Transactional是如何工作的

    转载 https://mp.weixin.qq.com/s/ZwhkUQF1Nun9pNrFI-3a6w 首先从说起.配置了,就必定有对应的标签解析器类,查看NamespaceHandler接口的实现 ...

  8. 使用ctypes在Python中调用C++动态库

    使用ctypes在Python中调用C++动态库 入门操作 使用ctypes库可以直接调用C语言编写的动态库,而如果是调用C++编写的动态库,需要使用extern关键字对动态库的函数进行声明: #in ...

  9. 64_s2

    sipwitch-1.9.15-3.fc26.x86_64.rpm 13-Feb-2017 09:19 162822 sipwitch-cgi-1.9.15-3.fc26.x86_64.rpm 13- ...

  10. Java学习(一)Scanner报错java.util.NoSuchElementException

    我在一个方法A中使用了Scanner的 Scanner input=new Scanner(System.in),随后又将其关闭了,因为Eclipse里面你若不关闭,他会有一个warning:Reso ...