【 HDU - 3062】Party(2-sat)
题干:
有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席。在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时出现在聚会上的。有没有可能会有n 个人同时列席?
Input
n: 表示有n对夫妻被邀请 (n<= 1000)
m: 表示有m 对矛盾关系 ( m < (n - 1) * (n -1))
在接下来的m行中,每行会有4个数字,分别是 A1,A2,C1,C2
A1,A2分别表示是夫妻的编号
C1,C2 表示是妻子还是丈夫 ,0表示妻子 ,1是丈夫
夫妻编号从 0 到 n -1
Output
如果存在一种情况 则输出YES
否则输出 NO
Sample Input
2
1
0 1 1 1
Sample Output
YES
解题报告:
直接2-sat裸题。因为题干中说一对夫妻有且只有一个人参加聚会,所以符合元素和元素的非 的性质。所以如果说A和B有仇,那就A->b , B -> a这样就好。
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define F first
#define S second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 3000 + 5;
struct Edge {int v,ne;
} e[5000005];
int n,m;
int head[MAX],tot;//1~n代表妻子,n+1到2*n代表丈夫
void add(int u,int v) {e[++tot].v = v;e[tot].ne = head[u];head[u] = tot;
}
int DFN[MAX],LOW[MAX],col[MAX],vis[MAX],index,stk[MAX],scc,clk;
void Tarjan(int x) {DFN[x] = LOW[x] = ++clk;vis[x] = 1;stk[++index] = x;for(int i = head[x]; ~i; i = e[i].ne) {int v = e[i].v;if(!DFN[v]) {Tarjan(v);LOW[x] = min(LOW[x],LOW[v]);}else if(vis[v]) LOW[x] = min(LOW[x],DFN[v]);}if(LOW[x] == DFN[x]) {scc++;while(1) {int tmp = stk[index--];col[tmp] = scc;vis[tmp] = 0;if(tmp == x) break;}}
}
void init(int n) {tot=0;clk=index=scc=0;for(int i = 1; i<=2*n; i++) head[i] = -1,DFN[i]=LOW[i]=vis[i]=col[i]=0;
}
int main()
{while(~scanf("%d%d",&n,&m)) {init(n);for(int c1,c2,a1,a2,i = 1; i<=m; i++) {scanf("%d%d%d%d",&a1,&a2,&c1,&c2);a1++,a2++;int U = a1 + c1*n,u=a1+(1-c1)*n;int V = a2 + c2*n,v=a2+(1-c2)*n;add(U,v);add(V,u); }for(int i = 1; i<=2*n; i++) {if(!DFN[i]) Tarjan(i);}int flag = 1;for(int i = 1; i<=n; i++) {if(col[i] == col[i+n]) {flag = 0;break;}}if(flag) puts("YES");else puts("NO");}return 0 ;
}
//20:10-20:39
总结:
当然对于这一题还有另一种建图方式:链接
对于这道题,我们首先要虚拟节点,对于编号为i的妻子a和丈夫b,做法如下: (我用!来表示非,毕竟那些符号不好办)
对妻子a: 对应的a虚拟为 节点 i ,对应的!a虚拟为节点 i + 2*N,
对丈夫b: 对应的b虚拟为节点i + N ,!b虚拟为节点 i + N + 2*N。 这样的话我们得到了4*N -1个节点。
由题意有以下建边方案
一:夫妻a,b只能去一人且必须去一人。 得布尔表达式 (!a -> b)合取(!b -> a)合取(b -> !a)合取(a -> !b)
二:有矛盾的两人不能同时去,这就意味着可能都不去。 得布尔表达式 (a -> !b)合取(b -> !a)
【 HDU - 3062】Party(2-sat)相关推荐
- 【HDU - 1455】Sticks (dfs + 剪枝)
题干: George took sticks of the same length and cut them randomly until all parts became at most 50 un ...
- 【HDU 5184】 Brackets (卡特兰数)
Brackets Problem Description We give the following inductive definition of a "regular brackets& ...
- 【HDU - 5672】String(尺取法)
题干: There is a string SS.SS only contain lower case English character.(10≤length(S)≤1,000,000)(10≤le ...
- 【HDU 1059】Dividing(多重背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1059 题意:有6种物品,价值分别是1,2,3,4,5,6,每种物品有n[ i ]个,,问是否能将其平分 ...
- *【HDU - 1042 】 N! (大数乘法)
题干: Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in one line, process ...
- 【HDU - 3328】Flipper (栈模拟)
题干: Problem Description Little Bobby Roberts (son of Big Bob, of Problem G) plays this solitaire mem ...
- 【HDU 5765】Bonds(进制运算妙用)
[HDU 5765]Bonds(进制运算妙用) Bonds Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K ...
- 微信支付 统一下单 字段 body 为中文时 报【签名错误】解决方案(C# SDK)
微信支付 统一下单 字段 body 为中文时 报[签名错误]解决方案(C# SDK) 参考文章: (1)微信支付 统一下单 字段 body 为中文时 报[签名错误]解决方案(C# SDK) (2)ht ...
- 【UOJ#188】Sanrd(min_25筛)
[UOJ#188]Sanrd(min_25筛) 题面 UOJ 题解 今天菊开讲的题目.(千古神犇陈菊开,扑通扑通跪下来) 题目要求的就是所有数的次大质因子的和. 这个部分和\(min\_25\)筛中枚 ...
最新文章
- 深度RNN解决语义搜索难题
- 4.2 深层网络中的前向传播-深度学习-Stanford吴恩达教授
- Django中六个常用的自定义装饰器
- java过滤结果集方法_QueryRunner类结果集处理的八种方法
- Java RMI远程方法调用详解
- Flutter中嵌入Android 原生TextView
- 在linux上使用labelImg制作LMDB数据集——备忘TX2上运行
- 记录一下:调试了虹软的人脸识别sdk,存到数据库中
- 设计模式之组合模式-树形结构的处理
- LTE-V2X车联网技术、标准、应用
- mac 锤子android助手,Mac+Android好帮手 锤子SmartFinder
- 为什么要知己知彼?要有信息?
- 云知声深耕智慧医疗,推出单病种质控平台赋能单病种质量控制
- matlab中频域信号IFFT,MATLAB中ifft函数用法、性质、特性-以及与fft的组合应用全面深入解析(含程序)...
- 如何更改VUE项目运行名称以及Logo图标
- python模型保存:保存字典数据 checkpiont+ pth文件处理
- 有关mean iou 言简意赅的介绍 及python 代码实现
- 互联网金融项目数据分析
- 来一次云台山,感受春天的温柔、夏日的魅力
- 计算机二级报名江南大学,江南大学2017年上半年计算机二级报名时间
热门文章
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]42蒙哥马利乘法,哪里泄漏侧信道路吗?
- 【数据结构与算法】【算法思想】【推荐系统】向量空间
- 【数据结构与算法】【算法思想】拓扑排序
- 百旺智能编码_【百旺】票字版开票软件操作指南已为您备好,请查阅!
- 跨站脚本专题 XSS
- vue编写to-do list源码
- java输出a-z_有1-26个数字和a-z字母,用Java多线程实现先输出2和数字再输出2个字
- 前端js获取图片大小 扩展名_前端 JS 获取 Image 图像 宽高 尺寸
- 页面 接收跳转数据_【实战案例】在线教育渠道落地页数据分析
- python两个同切圆_求两个圆的交点