[2-sat]HDOJ3062 Party

中文题 题意略

学2-sat啦啦啦

 

2-sat就是    矛盾的 ($x、x’$不能同时取) m对人 相互也有限制条件 取出其中n个人

也有可能是把一件东西分成 取/不取 相矛盾的两种情况 (那就要拆点啦~) 取其中n件

做法是 暴力 和 强连通 两种

重点在于建图:

对于x,记 取 为 $x$, 不取 为$x’$

对于y,记 取 为 $y$,  不取 为$y’$

对于 一对矛盾u($u、u'$) 和 一对矛盾v($v、v'$) 建立$u\Rightarrow v$的含义是 取$u$ 则 必须取$v$

那么对于事件“x、y不能同时选” 需要建立两条边: $x\Rightarrow y'$(取$x$ 则必定 取$y’$,也就是不取$y$) 、 $y\Rightarrow x'$(取$y$ 则必定 取$x’$,也就是不取$x$)

                 “x、y不能同时不选”                     $x'\Rightarrow y$(取$x’$,也就是不取$x$ 则必须取$y$) 、 $y’\Rightarrow x$(取$y’$,也就是不取$y$ 则必须取$x$)

                 “x、y要同时选”                           $x\Rightarrow y$(取$x$ 则 必须取$y$)

                 “x、y要同时不选”                        $x’\Rightarrow y’$(取$x’$ 则 必须取$y’$)

还有个比较特殊的: “x必须选”  

         这个建边的方法(类似于反证法)是 建立不能取x'的边

         $x'\Rightarrow x$ 

         结合边的含义来看:上述边的意义是:取x’(不取x) 则必须取x  

           显然这是矛盾的, 那么对于取x’ 这个方案是不行的,也就是必须取x

           呃(-。-;)这个有点绕。。。    就是  不取x是不行的 那就是取x咯

         在算法运行的过程中 一旦出现矛盾 比如上述的取x'(不取x) 又要取x的情况 那么就可以开始回溯了 这个方案是行不通的

 

噢 回到这道题

这道题 丈夫和妻子不能同时出席 就是x和x’ 了

比如案例0号丈夫和1号丈夫不能同时选

那就建  0丈夫$\Rightarrow$ 1妻子  、 1丈夫$\Rightarrow$ 0妻子  的两条边即可

 

然后套个九爷的模板啦啦啦就好啦

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 typedef pair<int, int> PI;
 5 #define INF 0x3f3f3f3f
 6 
 7 const int N=1005*2;
 8 const int M=N*N;
 9 //注意n是拆点后的大小 即 n <<= 1 N为点数(注意要翻倍) M为边数 i&1=0为i真 i&1=1为i假
10 struct Edge
11 {
12     int to, nex;
13 }edge[M];
14 //注意 N M 要修改
15 int head[N], edgenum;
16 void addedge(int u, int v)
17 {
18     Edge E={v, head[u]};
19     edge[edgenum]=E;
20     head[u]=edgenum++;
21 }
22 
23 bool mark[N];
24 int Stack[N], top;
25 void init()
26 {
27     memset(head, -1, sizeof(head));
28     edgenum=0;
29     memset(mark, 0, sizeof(mark));
30 }
31 
32 bool dfs(int x)
33 {
34     if(mark[x^1])
35         return false;//一定是拆点的点先判断
36     if(mark[x])
37         return true;
38     mark[x]=true;
39     Stack[top++]=x;
40     for(int i=head[x];i!=-1;i=edge[i].nex)
41         if(!dfs(edge[i].to))
42             return false;
43 
44     return true;
45 }
46 
47 bool solve(int n)
48 {
49     for(int i=0;i<n;i+=2)
50         if(!mark[i] && !mark[i^1])
51         {
52             top=0;
53             if(!dfs(i))
54             {
55                 while(top)
56                     mark[Stack[--top]]=false;
57                 if(!dfs(i^1))
58                     return false;
59             }
60         }
61     return true;
62 }
63 
64 int main()
65 {
66     int n;
67     while(~scanf("%d", &n))
68     {
69         int m;
70         scanf("%d", &m);
71         init();
72         while(m--)
73         {
74             int a1, a2, c1, c2;
75             scanf("%d%d%d%d", &a1, &a2, &c1, &c2);
76             addedge(2*a1+c1, 2*a2-c2+1);
77             addedge(2*a2+c2, 2*a1-c1+1);
78         }
79         solve(n)? puts("YES"): puts("NO");
80     }
81     return 0;
82 }
HDOJ 3062

 

转载于:https://www.cnblogs.com/Empress/p/4737520.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

node作为java中间间_node作为中间服务层如何发送请求(发送请求的实现方法详解)...

GET请求&#xff1a;var http require(http);var qs require(querystring);var data {a: 123,time: new Date().getTime()};//这是需要提交的数据var content qs.stringify(data);var options {hostname: 127.0.0.1,port: 10086,path: /pay/pay_callback? content,metho…

python目标识别代码_利用ImageAI库只需几行python代码超简实现目标检测

什么是目标检测目标检测关注图像中特定的物体目标&#xff0c;需要同时解决解决定位(localization) 识别(Recognition)。相比分类&#xff0c;检测给出的是对图片前景和背景的理解&#xff0c;我们需要从背景中分离出感兴趣的目标&#xff0c;并确定这一目标的描述(类别和位置…

Winodws live writer

发布一篇试试。 转载于:https://www.cnblogs.com/DotNetCSharp/p/4742956.html

java里面value_「Java基础知识」Java中包含哪些运算符

原标题&#xff1a;「Java基础知识」Java中包含哪些运算符在Java中包含的运算符有&#xff1a;算数运算符&#xff0c;逻辑运算符&#xff0c;关系运算符等。算数运算符也就是我们平时的加减乘除余等操作&#xff1a;在Java中都是将右边的值赋值给左边&#xff0c;所以一般格式…

三元组法矩阵加法java_计算机视觉学习笔记(2.1)-KNN算法中距离矩阵的计算

本笔记系列以斯坦福大学CS231N课程为大纲&#xff0c;海豚浏览器每周组织一次授课和习题答疑。具体时间地点请见微信公众号黑斑马团队(zero_zebra)和QQ群&#xff08;142961883&#xff09;发布。同时课程通过腾讯课堂&#xff08;百纳公开课&#xff09;进行视频直播.欢迎参与…

[转]Java常用概念解答

1. 事务是什么&#xff1f; 事务是作为一个逻辑单元执行的一系列操作&#xff0c;一个逻辑工作单元必须有四个属性&#xff0c;称为 ACID&#xff08;原子性、 一致性、隔离性和持久性&#xff09;属性&#xff0c;只有这样才能成为一个事务&#xff1a; 原子性 事务必须是原子…

idea maven创建java项目_新版本IntelliJ IDEA 构建maven,并用Maven创建一个web项目(图文教程)...

之前都没试过用maven来管理过项目&#xff0c;但是手动找包导包确实不方便&#xff0c;于是今天用2016版的IDEA进行了maven的初尝试。打开IDEA&#xff0c;创建新项目&#xff1a;然后选择Maven&#xff0c;以及选择自己电脑的jdk&#xff1a;接下来自定义GroupId以及ArtifactI…

Linux 格式化磁盘命令mkfs

linux格式化磁盘命令mkfs指令&#xff1a;mkfs使用权限 : 超级使用者使用方式 : mkfs [-V] [-t fstype] [fs-options] filesys [blocks] [-L Lable]说明 &#xff1a; 建立 linux 档案系统在特定的 partition 上参数 &#xff1a;device &#xff1a; 预备检查的硬盘 partition…

servlet 返回可访问文件_JavaWeb技术(4):Servlet的理解(上)

我们在开发中无时无刻都在与Servlet进行接触&#xff0c;只是因为框架的封装性&#xff0c;我们很少直接地去操作servlet&#xff0c;但再怎么封装&#xff0c;基本的思路都不会变化&#xff0c;变得只是实现的方式&#xff0c;Servlet是什么&#xff1a;网上的回答基本是Servl…

java ldap 分页_具有从属引用的 LDAP 分页查询未正确处理

具有从属引用的 LDAP 分页查询未正确处理09/14/2020本文内容本文提供了一些方法来避免使用从属引用的 LDAP 分页查询未正确处理的问题。原始产品版本&#xff1a; Windows 8原始 KB 编号&#xff1a; 2561166症状你有一个应用程序&#xff0c;使用 ldap_search_ext 或 ldap…

js分家效应

&#xff08;原创文章&#xff0c;转载请注明出处&#xff09; 有继承&#xff0c;那么就有分家。让我们看以下例子。 var parents function(){}parents.prototype.money 200;var children function(){}children.prototype new parents();var parent new parents();var ch…

如何设置打印的时候不加上页面链接_excel表格的这10个打印小技巧,办公室财务人员记得收藏...

打印工作表是日常工作中最常见的一个工作&#xff0c;也是Excel在工作中最常用的一个地方&#xff0c;如何做到快速准确地打印文件呢。今天文理会计小编给大家从网上整理了几个打印文件的小技巧。1、打印标题打印的工作表的数据有好多页的时候&#xff0c;为了查看方便&#xf…

java sql objects_第十五章-简书.sql

-- ## 练习1-- 1. 创建一个视图&#xff0c;通过该视图可以查询到工资在2000-5000内并且姓名中包含有A的员工编号&#xff0c;姓名&#xff0c;工资。create or replace view viewSal2k_5kas select empno,ename,sal from empwhere sal between 2000 and 5000and ename like %A…

rabbitmq 拉取消息太慢_面试官:消息队列这些我都要问

作者&#xff1a;mousycodersegmentfault.com/a/1190000021054802消息队列连环炮项目里怎么样使用 MQ 的&#xff1f;为什么要使用消息队列&#xff1f;消息队列有什么优点和缺点&#xff1f;kafka,activemq,rabbitmq,rocketmq 都有什么去呗&#xff1f;如何保证消息队列高可用…

java 星期顺序_第8周 【项目3-顺序串算法】

/**Copyright (c)2017,烟台大学计算机与控制工程学院*All rights reservrd.*作者&#xff1a;李欣豪*完成时间&#xff1a;2017年12月14日*版本号&#xff1a;v1.0*问题描述&#xff1a;采用顺序存储方式存储串&#xff0c;实现下列算法并测试&#xff1a;(1)试编写算法实现将…

[ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify uniq

angularjs 使用ng-repeat报错 <div ng-init"words [高校,高校,高校]" ng-repeat"word in words">{{word}} </div> [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use track by expression to specify unique keys 发现是因为相…

java 并列排名,178. 分数排名

题目描述编写一个 SQL 查询来实现分数排名。如果两个分数相同&#xff0c;则两个分数排名(Rank)相同。请注意&#xff0c;平分后的下一个名次应该是下一个连续的整数值。换句话说&#xff0c;名次之间不应该有“间隔”。-----------| Id | Score |-----------| 1 | 3.50 || 2 |…

编写高质量代码改善C#程序的157个建议——建议130:以复数命名枚举类型,以单数命名枚举元素...

建议130&#xff1a;以复数命名枚举类型&#xff0c;以单数命名枚举元素 枚举类型应该具有负数形式&#xff0c;它表达的是将一组相关元素组合起来的语义。比如&#xff1a; enum Week{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday} 在这里&#xff0c;Week对于星…

python 定义变量_第三章(第2节):变量和常量

变量的概念基本上和初中代数的方程变量是一致的&#xff0c;只是在计算机程序中&#xff0c;变量不仅可以是数字&#xff0c;还可以是任意数据类型&#xff0c;比如我们上节课刚刚学过的基本数据类型或者我们后面要学的自定义数据类型。所谓常量就是不能改变的变量&#xff0c;…

OpenStack Weekly Rank 2015.08.24

Module  Reviews  Drafted Blueprints  Completed Blueprints  Filed Bugs  Resolved Bugs Cinder  5      1          1            6       13 Swift   10     N/A         N/A           8   …