几个关于2-sat的题

HDU3062

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3062

题意:

从2n个人去宴会,有 m条关系 i和j不能同时去 夫妻不能同时去 问能否有n个人出席

题解:

因为是n对夫妻,我们将编号扩展 奇数是丈夫,偶数是妻子

那么m条关系就是 i*2+a 和j*2+b不能同时出席

建边 选b必选 a‘

选a必选b'

然后判断是否在一个强连通分量里面即可

代码:

/**
*        ┏┓    ┏┓
*        ┏┛┗━━━━━━━┛┗━━━┓
*        ┃       ┃  
*        ┃   ━    ┃
*        ┃ >   < ┃
*        ┃       ┃
*        ┃... ⌒ ...  ┃
*        ┃       ┃
*        ┗━┓   ┏━┛
*          ┃   ┃ Code is far away from bug with the animal protecting          
*          ┃   ┃   神兽保佑,代码无bug
*          ┃   ┃           
*          ┃   ┃       
*          ┃   ┃
*          ┃   ┃           
*          ┃   ┗━━━┓
*          ┃       ┣┓
*          ┃       ┏┛
*          ┗┓┓┏━┳┓┏┛
*           ┃┫┫ ┃┫┫
*           ┗┻┛ ┗┻┛
*/
// warm heart, wagging tail,and a smile just for you!
//
//                           _ooOoo_
//                           o8888888o
//                           88" . "88
//                           (| -_- |)
//                           O\ = /O
//                       ____/`---'\____
//                     .' \|     |// `.
//                     / \||| : |||// \
//                   / _||||| -:- |||||- \
//                   |   | \ - /// |   |
//                   | \_| ''\---/'' |   |
//                   \ .-\__ `-` ___/-. /
//                 ___`. .' /--.--\ `. . __
//               ."" '< `.___\_<|>_/___.' >'"".
//             | | : `- \`.;`\ _ /`;.`/ - ` : | |
//             \ \ `-.   \_ __\ /__ _/   .-` / /
//         ======`-.____`-.___\_____/___.-`____.-'======
//                           `=---='
//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//                     佛祖保佑     永无BUG
#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef unsigned long long uLL;
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define bug printf("*********\n")
#define FIN freopen("input.txt","r",stdin);
#define FON freopen("output.txt","w+",stdout);
#define IO ios::sync_with_stdio(false),cin.tie(0)
#define debug1(x) cout<<"["<<#x<<" "<<(x)<<"]\n"
#define debug2(x,y) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<"]\n"
#define debug3(x,y,z) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<" "<<#z<<" "<<z<<"]\n"
const int maxn = 2e3 + 5;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double Pi = acos(-1);
LL gcd(LL a, LL b) {
   return b ? gcd(b, a % b) : a;
}
LL lcm(LL a, LL b) {
   return a / gcd(a, b) * b;
}
double dpow(double a, LL b) {
   double ans = 1.0;
   while(b) {
       if(b % 2)ans = ans * a;
       a = a * a;
       b /= 2;
  } return ans;
}
LL quick_pow(LL x, LL y) {
   LL ans = 1;
   while(y) {
       if(y & 1) {
           ans = ans * x % mod;
      } x = x * x % mod;
       y >>= 1;
  } return ans;
}
struct EDGE {
   int v, nxt;
} edge[maxn * maxn];
int n, m;
int head[maxn], tot;
void add_edge(int u, int v) {
   edge[tot].v = v;
   edge[tot].nxt = head[u];
   head[u] = tot++;
}
int low[maxn], dfn[maxn], num, in[maxn], scc[maxn];
int Stack[maxn], top, cnt;
void tarjan(int u) {
   low[u] = dfn[u] = ++num;
   Stack[top++] = u;
   in[u] = 1;
   for(int i = head[u]; i != -1; i = edge[i].nxt) {
       int v = edge[i].v;
       if(!dfn[v]) {
           tarjan(v);
           low[u] = min(low[u], low[v]);
      } else if(in[v]) {
           low[u] = min(low[u], dfn[v]);
      }
  }
   if(low[u] == dfn[u]) {
       int v;
       cnt++;
       do {
           v = Stack[--top];
           in[v] = 0;
           scc[v] = cnt;
      } while(u != v);
  }
}
bool Two_sat() {
   for(int i = 0; i < 2 * n; i++) {
       if(!dfn[i]) {
           tarjan(i);
      }
  }
   for(int i = 0; i < n; i++) {
       if(scc[i * 2] == scc[i * 2 + 1]) return false;
  }
   return true;
}
int main() {
#ifndef ONLINE_JUDGE
   FIN
#endif
   while(~scanf("%d%d", &n, &m)) {
       memset(head, -1, sizeof(head));
       memset(dfn, 0, sizeof(dfn));
       memset(low, 0, sizeof(low));
       memset(scc, 0, sizeof(scc));
       tot = 0;
       num = 0;
       top = 0;
       cnt = 0;
       for(int i = 1; i <= m; i++) {
           int a, vala;
           int b, valb;
           scanf("%d%d%d%d", &a, &b,  &vala, &valb);
           a = a * 2 + vala;
           b = b * 2 + valb;
           add_edge(a, b ^ 1);  //选A必选B'
           add_edge(b, a ^ 1);  //选B必选A'
      }
       if(Two_sat()) {
           printf("YES\n");
​
      } else {
           printf("NO\n");
      }
  }
   return 0;
}

洛谷P4782

传送门:https://www.luogu.org/problem/P4782

题意:

2-sat模板题

题解:

建边

为或为​

​

建图

代码:

/**
*        ┏┓    ┏┓
*        ┏┛┗━━━━━━━┛┗━━━┓
*        ┃       ┃  
*        ┃   ━    ┃
*        ┃ >   < ┃
*        ┃       ┃
*        ┃... ⌒ ...  ┃
*        ┃       ┃
*        ┗━┓   ┏━┛
*          ┃   ┃ Code is far away from bug with the animal protecting          
*          ┃   ┃   神兽保佑,代码无bug
*          ┃   ┃           
*          ┃   ┃       
*          ┃   ┃
*          ┃   ┃           
*          ┃   ┗━━━┓
*          ┃       ┣┓
*          ┃       ┏┛
*          ┗┓┓┏━┳┓┏┛
*           ┃┫┫ ┃┫┫
*           ┗┻┛ ┗┻┛
*/
// warm heart, wagging tail,and a smile just for you!
//
//                           _ooOoo_
//                           o8888888o
//                           88" . "88
//                           (| -_- |)
//                           O\ = /O
//                       ____/`---'\____
//                     .' \|     |// `.
//                     / \||| : |||// \
//                   / _||||| -:- |||||- \
//                   |   | \ - /// |   |
//                   | \_| ''\---/'' |   |
//                   \ .-\__ `-` ___/-. /
//                 ___`. .' /--.--\ `. . __
//               ."" '< `.___\_<|>_/___.' >'"".
//             | | : `- \`.;`\ _ /`;.`/ - ` : | |
//             \ \ `-.   \_ __\ /__ _/   .-` / /
//         ======`-.____`-.___\_____/___.-`____.-'======
//                           `=---='
//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//                     佛祖保佑     永无BUG
#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef unsigned long long uLL;
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define bug printf("*********\n")
#define FIN freopen("input.txt","r",stdin);
#define FON freopen("output.txt","w+",stdout);
#define IO ios::sync_with_stdio(false),cin.tie(0)
#define debug1(x) cout<<"["<<#x<<" "<<(x)<<"]\n"
#define debug2(x,y) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<"]\n"
#define debug3(x,y,z) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<" "<<#z<<" "<<z<<"]\n"
const int maxn = 2e6 + 5;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double Pi = acos(-1);
LL gcd(LL a, LL b) {
   return b ? gcd(b, a % b) : a;
}
LL lcm(LL a, LL b) {
   return a / gcd(a, b) * b;
}
double dpow(double a, LL b) {
   double ans = 1.0;
   while(b) {
       if(b % 2)ans = ans * a;
       a = a * a;
       b /= 2;
  } return ans;
}
LL quick_pow(LL x, LL y) {
   LL ans = 1;
   while(y) {
       if(y & 1) {
           ans = ans * x % mod;
      } x = x * x % mod;
       y >>= 1;
  } return ans;
}
struct EDGE {
   int v, nxt;
} edge[maxn << 1];
   int n, m;
int head[maxn], tot;
void add_edge(int u, int v) {
   edge[tot].v = v;
   edge[tot].nxt = head[u];
   head[u] = tot++;
}
int low[maxn], dfn[maxn], num,in[maxn],scc[maxn];
int Stack[maxn],top, cnt;
void tarjan(int u) {
   low[u] = dfn[u] = ++num;
   Stack[top++] = u;
   in[u] = 1;
   for(int i = head[u]; i != -1; i = edge[i].nxt) {
       int v = edge[i].v;
       if(!dfn[v]) {
           tarjan(v);
           low[u] = min(low[u], low[v]);
      } else if(in[v]) {
           low[u] = min(low[u], dfn[v]);
      }
  }
   if(low[u] == dfn[u]) {
       int v;
       cnt++;
       do {
           v = Stack[--top];
           in[v] = 0;
           scc[v] = cnt;
      } while(u != v);
  }
}
bool Two_sat() {
   for(int i = 1; i <= 2 * n; i++) {
       if(!dfn[i]) {
           tarjan(i);
      }
  }
   for(int i = 1; i <= n; i++) {
       if(scc[i] == scc[i + n]) return false;
  }
   return true;
}
int main() {
#ifndef ONLINE_JUDGE
   FIN
#endif
   memset(head, -1, sizeof(head));
   tot = 0;
​
   scanf("%d%d", &n, &m);
   for(int i = 1; i <= m; i++) {
       int a, vala;
       int b, valb;
       scanf("%d%d%d%d", &a, &vala, &b, &valb);
       int nota = !vala;
       int notb = !valb;
       add_edge(a + nota * n, b + valb * n);
       add_edge(b + notb * n, a + vala * n);
  }
   if(Two_sat()) {
       printf("POSSIBLE\n");
       for(int i = 1; i <= n; i++) {
           printf("%d ", scc[i] > scc[i + n]);
      }
  } else {
       printf("IMPOSSIBLE\n");
  }
   return 0;
}

几个关于2-sat的题的更多相关文章

  1. Go Deeper HDU - 3715(2 - sat 水题 妈的 智障)

    Go Deeper Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  2. ocp 1Z0-043 131-205题解析

    131. Which three methods can you use to run an Automatic Database Diagnostic Monitor (ADDM) analysis ...

  3. poj3393[模拟题]

    Lucky and Good Months by Gregorian Calendar Time Limit: 1000MS   Memory Limit: 65536K Total Submissi ...

  4. 浙江大学PAT上机题解析之1014. 福尔摩斯的约会 (20)

    1014. 福尔摩斯的约会 (20) 时间限制   50 ms 内存限制   32000 kB 代码长度限制   8000 B 判题程序     Standard     作者     CHEN, Y ...

  5. java小题:福尔摩斯的约会

    原题地址:https://www.nowcoder.com/pat/6/problem/4040 防止广告嫌疑,原题为: 题目描述 大侦探福尔摩斯接到一张奇怪的字条:"我们约会吧! 3485 ...

  6. z3 巧解CTF逆向题

    z3 巧解逆向题 题目下载链接:http://reversing.kr/download.php?n=7 这次实验的题目为Reversing.kr网站中的一道题目. 题目要求: ReversingKr ...

  7. PAT 甲级真题题解(1-62)

    准备每天刷两题PAT真题.(一句话题解) 1001 A+B Format  模拟输出,注意格式 #include <cstdio> #include <cstring> #in ...

  8. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  9. 标 题: Re: 总感觉IT没我大山东啥事?

    发信人: liuzhlai (liuzhlai), 信区: ITExpress 标  题: Re: 总感觉IT没我大山东啥事? 发信站: 水木社区 (Sat Aug 22 15:51:50 2015) ...

  10. java基础50道编程题

    50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析 ...

随机推荐

  1. POJ - 1679_The Unique MST

    The Unique MST Time Limit: 1000MS Memory Limit: 10000K Description Given a connected undirected grap ...

  2. bzoj4152 The Captain

    Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. Input 第一行包含一个正整数n(2 ...

  3. 巨蟒python全栈开发-第11阶段 ansible_project5

    今日大纲 1.命令展示前端页面实现(下面有个断点) 2.命令下发后端展示

  4. python 替换字符串的方法replace()、正则re.sub()

    一.replace()函数1用字符串本身的replace方法: a = 'hello word' b = a.replace('word','python') print b   1 2 3 二.re ...

  5. JPA使用nativequery多表关联查询返回自定义实体类

    本文为JPA的学习采坑,如有问题欢迎指正. JPA官方推荐的多表关联查询使用不便,接触的有些项目可能会使用JPA 做简单查询,Mybaits做复杂查询.所以想要寻找一种好用的解决方案. JPA多表关联 ...

  6. oracle函数 RAWTOHEX(c1)

    [功能]将一个二进制构成的字符串转换为十六进制 [参数]c1,二进制的字符串 [返回]字符串 [示例] select RAWTOHEX('A123')  from dual;

  7. Java练习 SDUT-1253_进制转换

    进制转换 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入一个十进制数N,将它转换成R进制数输出. Input 输入 ...

  8. 阿里云BaaS:降低区块链应用门槛,用技术构建商业互信

    5月8日,阿里云召开区块链服务(BaaS)商业化发布会,会上对BaaS产品.业务应用场景及生态策略进行了全面解读. 对于广大IT服务商和开发者而言,构建区块链应用存在三大痛点问题:成本高,研发投入大. ...

  9. 自定义View系列教程08--滑动冲突的产生及其处理

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  10. SecureCRT 7.1.1和SecureFx key 亲测可用

    CRT:Name: ygeRCompany: TEAM ZWTSerialNumber: 03-77-119256License Key: ABH2MJ 9YVAC5 Z17QF7 4ZAS7Z AB ...