题干:

有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)相关推荐

  1. 【HDU - 1455】Sticks (dfs + 剪枝)

    题干: George took sticks of the same length and cut them randomly until all parts became at most 50 un ...

  2. 【HDU 5184】 Brackets (卡特兰数)

    Brackets Problem Description We give the following inductive definition of a "regular brackets& ...

  3. 【HDU - 5672】String(尺取法)

    题干: There is a string SS.SS only contain lower case English character.(10≤length(S)≤1,000,000)(10≤le ...

  4. 【HDU 1059】Dividing(多重背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1059 题意:有6种物品,价值分别是1,2,3,4,5,6,每种物品有n[ i ]个,,问是否能将其平分 ...

  5. *【HDU - 1042 】 N! (大数乘法)

    题干: Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in one line, process ...

  6. 【HDU - 3328】Flipper (栈模拟)

    题干: Problem Description Little Bobby Roberts (son of Big Bob, of Problem G) plays this solitaire mem ...

  7. 【HDU 5765】Bonds(进制运算妙用)

    [HDU 5765]Bonds(进制运算妙用) Bonds Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K ...

  8. 微信支付 统一下单 字段 body 为中文时 报【签名错误】解决方案(C# SDK)

    微信支付 统一下单 字段 body 为中文时 报[签名错误]解决方案(C# SDK) 参考文章: (1)微信支付 统一下单 字段 body 为中文时 报[签名错误]解决方案(C# SDK) (2)ht ...

  9. 【UOJ#188】Sanrd(min_25筛)

    [UOJ#188]Sanrd(min_25筛) 题面 UOJ 题解 今天菊开讲的题目.(千古神犇陈菊开,扑通扑通跪下来) 题目要求的就是所有数的次大质因子的和. 这个部分和\(min\_25\)筛中枚 ...

最新文章

  1. 深度RNN解决语义搜索难题
  2. 4.2 深层网络中的前向传播-深度学习-Stanford吴恩达教授
  3. Django中六个常用的自定义装饰器
  4. java过滤结果集方法_QueryRunner类结果集处理的八种方法
  5. Java RMI远程方法调用详解
  6. Flutter中嵌入Android 原生TextView
  7. 在linux上使用labelImg制作LMDB数据集——备忘TX2上运行
  8. 记录一下:调试了虹软的人脸识别sdk,存到数据库中
  9. 设计模式之组合模式-树形结构的处理
  10. LTE-V2X车联网技术、标准、应用
  11. mac 锤子android助手,Mac+Android好帮手 锤子SmartFinder
  12. 为什么要知己知彼?要有信息?
  13. 云知声深耕智慧医疗,推出单病种质控平台赋能单病种质量控制
  14. matlab中频域信号IFFT,MATLAB中ifft函数用法、性质、特性-以及与fft的组合应用全面深入解析(含程序)...
  15. 如何更改VUE项目运行名称以及Logo图标
  16. python模型保存:保存字典数据 checkpiont+ pth文件处理
  17. 有关mean iou 言简意赅的介绍 及python 代码实现
  18. 互联网金融项目数据分析
  19. 来一次云台山,感受春天的温柔、夏日的魅力
  20. 计算机二级报名江南大学,江南大学2017年上半年计算机二级报名时间

热门文章

  1. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]42蒙哥马利乘法,哪里泄漏侧信道路吗?
  2. 【数据结构与算法】【算法思想】【推荐系统】向量空间
  3. 【数据结构与算法】【算法思想】拓扑排序
  4. 百旺智能编码_【百旺】票字版开票软件操作指南已为您备好,请查阅!
  5. 跨站脚本专题 XSS
  6. vue编写to-do list源码
  7. java输出a-z_有1-26个数字和a-z字母,用Java多线程实现先输出2和数字再输出2个字
  8. 前端js获取图片大小 扩展名_前端 JS 获取 Image 图像 宽高 尺寸
  9. 页面 接收跳转数据_【实战案例】在线教育渠道落地页数据分析
  10. python两个同切圆_求两个圆的交点