题意:给你一张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. 利用Addon Domain和A记录使两个域名同时指向同一个网站

    今天碰到这样的需求:已有网站A.com, 以及新注册的域名B.net, 现需要将B.net指向与A.com相同的内容. 这里提出的方法是在空间后台添加Addon domain, 以及在域名B.net后 ...

  2. jQuery的validation插件(验证表单插件)

    更完整的参考:http://www.runoob.com/jquery/jquery-plugin-validate.html 验证隐藏字段的使用(验证通过后ajax提交表单):http://www. ...

  3. bugku数字验证绕过正则

    题目:http://120.24.86.145:9009/21.php 第6行使用正则匹配如果匹配到$password开头12个字符中有空格则输出flag并执行exit; 12行是正则匹配$passw ...

  4. 【51nod1006】simple KMP

    原题意看的挺迷糊的,后来看了http://blog.csdn.net/YxuanwKeith/article/details/52351335大爷的题意感觉清楚的多…… 做法也非常显然了,用树剖维护后 ...

  5. 剑指offer算法题

    数组中只出现一次的数字(一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字): 解法在于位运算中的异或,直接异或可以得到这两个数的异或,按照最后的有效数字位可以 ...

  6. 转:PHP环境搭建 - Linux

    本文PHP环境采用,nginx + PHP7 + mysql 5.6 一.安装mysql 5.6 参见:http://www.cnblogs.com/rslai/p/7853465.html 二.Ng ...

  7. java并发编程实战笔记---(第三章)对象的共享

    3.1 可见性 synchronized 不仅实现了原子性操作或者确定了临界区,而且确保内存可见性. *****必须在同步中才能保证:当一个线程修改了对象状态之后,另一个线程可以看到发生的状态变化. ...

  8. 深度学习方法(十一):卷积神经网络结构变化——Google Inception V1-V4,Xception(depthwise convolution)

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.机器学习技术感兴趣的同学加入. 上一篇讲了深度学习方法(十) ...

  9. 快速地从Redhat系转Ubuntu系

    ubuntu官网的,https://help.ubuntu.com/community/SwitchingToUbuntu/FromLinux/RedHatEnterpriseLinuxAndFedo ...

  10. 【PAT】1002. A+B for Polynomials (25)

    1002. A+B for Polynomials (25) This time, you are supposed to find A+B where A and B are two polynom ...