几个关于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. centos6.5后台进程的切换

    1.运行.sh文件 直接用./sh 文件就可以运行,但是如果想后台运行,即使关闭当前的终端也可以运行的话,需要nohup命令和&命令. (1)&命令 功能:加在一个命令的最后,可以把这 ...

  2. 让PHP文件每隔几秒执行一次

    转自:http://www.blhere.com/966.html 背景是这样的:我需要一段PHP代码去定期对数据库操作,并把结果保存起来.如果方法是用户请求的时候来触发执行这个代码,显然用户的响应时 ...

  3. HDU 4217

    点击打开题目链接 题型就是数据结构.给一个数组,然后又k次操作,每次操作给定一个数ki, 从数组中删除第ki小的数,要求的是k次操作之后被删除的所有的数字的和. 简单的思路就是,用1标记该数没有被删除 ...

  4. LeetCode153 Find Minimum in Rotated Sorted Array. LeetCode162 Find Peak Element

    二分法相关 153. Find Minimum in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unkn ...

  5. 64位linux源码安装mysql

    一:下载mysql http://dev.mysql.com/downloads/mysql/中的Generally Available(GA) Releases标签页,在MySQL Communit ...

  6. linux环境变量设置和默认执行语句设置

    环境变量设置 1.export export ORACLE_HOME=/usr/local/instantclient_12_2export PATH=$ORACLE_HOME:$PATHexport ...

  7. laravel 5 自定义全局函数,怎么弄呢?

    在app/Helpers/(目录可以自己随便来) 下新建一个文件 functions.php 在functions.php 中加入这个方法 然后在 bootstrap/autoload.php 中添加 ...

  8. JVM问题诊断

    https://gitbook.cn/books/5d2d822f175a450263e945f9/index.html

  9. 解决 vs 出现Error MC3000 给定编码中的字符无效

    在 xaml 写中文注释,发现编译失败 Error MC3000 给定编码中的字符无效 我的 xaml 写了一句代码 <Grid> <!--林德熙--> </Grid&g ...

  10. iptables 删除规则

    iptables -nL --line-number显示每条规则链的编号 iptables -D FORWARD 2删除FORWARD链的第2条规则,编号由上一条得知.如果删除的是nat表中的链,记得 ...