JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会

题目

Description

“那么真的有果尔德施坦因这样一个人?”他问道。
“是啊,有这样一个人,他还活着。至于在哪里,我就不知道了。”
“那么那个密谋——那个组织?这是真的吗?不是秘密警察的捏造吧?”
“不是,这是真的。我们管它叫兄弟会。除了它确实存在,你们是它的会员以外,你们 就别想知道别的了。”
他知道的是,这种思想一定会一代一代地传下去,他们一定能够在没有黑暗的地方再会。
他不知道的是,兄弟会已经走到了崩溃的边缘;思想警察早已无孔不入;那没有黑暗的地方, 是友爱部,是 101 室……
兄弟会的头目之一,爱麦虞埃尔•果尔德施坦因,正在谋划着一场无力的反抗。这抗争的内容,竟是一场宏大的舞会。(这作为小资情调、腐朽没落的代表,以及未经允许的群众运动, 是大洋国严格禁止的(甚至是 crimethink))这也是为了加强组织的团结,并且为那终将到来的最后一战而激励、鼓舞士气。
众所周知,兄弟会为了避免思想警察的追捕,保密措施相当严密。会内一位高级干部奥勃良如此说:“从你们切身经验来说,你们永远连十来个会员也不认识。”(注意:测试数据可能不符合这句话)具体来说,每个人只认识他的全部上司。一个人的上司要么是他的直接上司
(在输入中会向你给出,并且可能不止一人),要么是这个人的某个上司的直接上司。为了增进同志之间的感情,同时为了防止渗入兄弟会的间谍破获整个组织的组成与结构,果尔德 施坦因想要确保在舞会中任意两个人都互不相识。
真理部的外围党员温斯顿在奥勃良的介绍下加入了兄弟会。他刚刚知道了这个激动人心的舞 会,仿佛又感受到了那若有若无的、来自旧时代的温暖。因为参与舞会的人越多,他与他亲爱的裘莉亚就越有可能重逢,所以他很好奇最多能有多少人参与。

Input

第一行两个正整数 N,M,表示兄弟会的会员人数以及关系数。然后 M 行,每行 2 个正整数 x,y(1<=x,y<=N,x≠y),表示 x 是 y 的直接上司(即 y 是 x 的直接下属)。

Output

输出一行一个整数,表示参加舞会的最多人数。

Sample Input

4 4
1 2
2 4
1 3
3 4

Sample Output

2

Data Constraint

对于 5%数据,满足 n<=5。
对于 20%数据,满足 n<=20。
对于另 10%数据,满足会员构成一棵外向树,即:除了一号会员(即果尔德施坦因本人)之外的每个会员,恰好只有一个上司,且一号会员没有上司。
对于另 10%数据,满足会员构成一颗内向树,即:除了一号会员(即温斯顿)之外的每个会员,恰好只有一个直接下属,且一号会员没有下属。
对于另 30%数据,满足每个会员要么没有上司,要么没有下属。
对于 100%数据,满足 n<=200,关系不会重复出现,且不会自相矛盾(即 A 既是 B 的上司也是 B 的下属)。换句话说,关系构成了一张无重边的有向无环图。保证图联通。


做法

显然,这是一个有向无环图。
对于每一条有向边(u,v)(u,v),表示vvuu的的上司。
题目要让我们在图上找到尽量多的点,使得这些点不能互相到达。
咋做?
题解上这样说:

在有向无环图中,我们定义:
链:图上一些点的集合,对于链上任意两个点 x、y,满足 x 能到达 y 或者 y
能到达 x。
反链:图上一些点的的集合,对于反链上任意两个点 x、y,满足 x 不能到达
y 并且 y 不能到达 x。
所以就是很显然的求最长反链长度了~
有以下 Dilworth 定理:
最长反链长度=最小链覆盖(选取最少的链覆盖所有的点)

这是题解上话,然后我上网找这条定理的证明,结果……证明很少,并且好几篇博客是一个样子,而且让我一脸懵逼,甚至感觉那证明还是错的……
于是,只能感性理解。
假设用一些链来覆盖整张图。
对于每个反链上的点,它们各自在一条链上。
如果这些链的数量大于最小链覆盖,那么多出来的那些都是废的,会出现两个反链上的点能连通,与题目不符……
好吧,感性理解这种东西是不方便用语言来说的。
现在假设我们已经知道了这个定理。
接下来可以用二分图匹配来解决:
将每个点拆成左右两边(实现时不需要)。
对于一条边(u,v)(u,v),就在二分图上uleftuleftvrightvright连一条有向边。
跑一遍二分图匹配,那么答案就是nn−最大匹配数
Why?
在二分图,连一条边,可以视为将两条链合并,也就是将最小链覆盖数1−1
拆成二分图,避免路径相交的问题。


代码

using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 200
int n,m;
bool to[MAXN+1][MAXN+1];//表示是否连通
int be[MAXN*2+1];
bool vis[MAXN+1];
bool matching(int);
int main(){freopen("dance.in","r",stdin);freopen("dance.out","w",stdout);scanf("%d%d",&n,&m);for (int i=1;i<=m;++i){int u,v;scanf("%d%d",&u,&v);to[v][u]=1;}//要用Floyed来处理处连通性for (int k=1;k<=n;++k)for (int i=1;i<=n;++i)for (int j=1;j<=n;++j)to[i][j]|=to[i][k]&&to[k][j]; int max_matching=0;for (int i=1;i<=n;++i){memset(vis,0,sizeof vis);if (matching(i))max_matching++;}printf("%d\n",n-max_matching);return 0;
}
bool matching(int x){for (int i=1;i<=n;++i)if (to[x][i] && !vis[i]){vis[i]=1;if (!be[i] || matching(be[i])){be[i]=x;return 1;}}return 0;
}

总结

这题好打是好打,就是理解得迷迷糊糊的。
感性理解还是很重要的……

转载于:https://www.cnblogs.com/jz-597/p/11145275.html

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

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

相关文章

python 中如何判断list中是否包含某个元素

在python中可以通过in和not in关键字来判读一个list中是否包含一个元素 theList [‘a’,’b’,’c’] if ‘a’ in theList: print ‘a in the list’ if ‘d’ not in theList: print ‘d is not in the list’

时间即财富:创业者浪费精力的八个错误

导读&#xff1a;本文作者Jeff Miller是美食网页应用Punchfork的创始人&#xff0c;同时也是DuckDuckGo、Ginzametrics、Art.sy、DataMinr以及Forkly的投资人。作者通过对自己创业初期一些错误选择进行盘点&#xff0c;告诉读者在创业初期应该学会选择&#xff0c;因为在创业初…

写给大数据开发初学者的话3

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 如果你已经按照《写给大数据开发初学者的话2》中第三章和第四章的流程认真完整的走了一遍&#xff0c;那么你应该已经具备以下技能和知识…

十五周二次课

18.6 负载均衡集群介绍 主流开源软件LVS、keepalived、haproxy、nginx等其中LVS属于4层&#xff08;网络OSI 7层模型&#xff09;&#xff0c;nginx属于7层&#xff0c;haproxy既可以认为是4层&#xff0c;也可以当做7层使用keepalived的负载均衡功能其实就是lvslvs这种4层的负…

LeetCode--171--Excel表列序号

问题描述&#xff1a; 给定一个Excel表格中的列名称&#xff0c;返回其相应的列序号。 例如&#xff0c; A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 ...示例 1: 输入: "A" 输出: 1示例 2: 输入: "AB" 输出: 28示例 3: 输入: "…

中国历代王朝大排名

中国自秦以降&#xff0c;一共出过九个大王朝&#xff0c;它们是&#xff1a;秦、汉、晋、隋、唐、宋、元、明、清。另外&#xff0c;还出过五十几个小王朝&#xff0c;它们是&#xff1a; 三国时的魏、蜀、吴&#xff0c;共三个&#xff1b; [ 转自铁血社区 http://bbs.tiexue…

写给大数据开发初学者的话4

见&#xff1a;http://lxw1234.com/archives/2016/11/795.htm 如果你已经按照《写给大数据开发初学者的话3》中第五章和第六章的流程认真完整的走了一遍&#xff0c;那么你应该已经具备以下技能和知识点&#xff1a; 为什么Spark比MapReduce快。使用SparkSQL代替Hive&#xff…

TPS及计算方法

TPS (transaction per second)代表每秒执行的事务数量&#xff0c;可基于测试周期内完成的事务数量计算得出。例如&#xff0c;用户每分钟执行6个事务&#xff0c;TPS为6 / 60s 0.10 TPS。同时我们会知道事务的响应时间(或节拍)&#xff0c;以此例&#xff0c;60秒完成6个事务…

域名解析服务之DNS查询类型

在实际应用中DNS查询主要分为两种方式查询&#xff1a;1.递归查询&#xff1b;2.迭代查询 一般情况下&#xff1a;为了减少资源的消耗&#xff0c;网络中客户端与所属的本地DNS服务器查询方式通常为递归查询&#xff0c;本地DNS服务器与外部的公共DNS服务器间的查询方式为迭代查…

MFC Ribbon界面设计

Ribbon是类似于office2007样式的界面&#xff0c;它替代了传统的MFC程序里的菜单和工具栏 MFC默认生成的Ribbon功能少&#xff0c;需要我们自己添加一些控件和图片等元素使界面好看 看下面的一个界面&#xff0c;是VC2010示例里的 看到它与默认Ribbon样式的区别&#xff1a; 工…

互联网手机躁动:“周大炮”追逐“雷布斯”

摘要&#xff1a;周鸿祎选择非自有品牌补贴&#xff0c;可能是看到了小米初期的艰难&#xff0c;也想追求速度&#xff0c;绕开自制手机终端环节。于小米而言&#xff0c;需要解决后续机型承接、持续稳定提升产能&#xff1b;对360而言&#xff0c;需要投入巨量补贴资金&#x…

获取泛型T的ClassT clazz

在我们搭建框架中往往会用到泛型,我们知道泛型的好处是在编译的时候检查类型安全&#xff0c;并且所有的强制转换都是自动和隐式的&#xff0c;代码的重用率高 然而有时候<method>的入参并不能直接强制转换成泛型的类型,比如说下面这段代码&#xff1a; 很明显String 类…

写给大数据开发初学者的话5

见&#xff1a;http://lxw1234.com/archives/2017/01/832.htm 至此&#xff0c;你的大数据平台底层架构已经成型了&#xff0c;其中包括了数据采集、数据存储与计算&#xff08;离线和实时&#xff09;、数据同步、任务调度与监控这几大模块。接下来是时候考虑如何更好的对外提…

3.spring boot Controller获取请求参数的值

2019独角兽企业重金招聘Python工程师标准>>> 1.获取连接中的参数,使用倒的关键词PathVariable RestController public class HelloController {RequestMapping(value "/hello/{id}",method RequestMethod.GET)public String index(PathVariable("i…

断开的管道 java.io.IOException: Broken pipe 解决方法

断开的管道 java.io.IOException: Broken pipe 解决方法一、Broken pipe产生原因分析1.当访问某个服务突然服务器挂了&#xff0c;就会产生Broken pipe;2.客户端读取超时关闭了连接&#xff0c;这时服务器往客户端再写数据就发生了broken pipe异常&#xff01;二、方案1.问题一…

登录与注册

代码如下 private void btn_login_Click(object sender, EventArgs e){SqlConnection sqlconnection new SqlConnection();sqlconnection.ConnectionString ConfigurationManager.ConnectionStrings["SQL"].ConnectionString;SqlCommand sqlcommand new SqlComman…

四大电商对垒价格战:家电高库存或是推手

摘要&#xff1a;[京东、苏宁、国美、天猫等电商在家电领域的价格战&#xff0c;更多是定价方家电厂商的倒逼]  “五一”期间&#xff0c;电商企业发起的价格战硝烟仍未消散&#xff0c;如今战火又起。一种较为普遍的看法是&#xff0c;此次价格战&#xff0c;正是各家电商企…

三分钟明白 Activiti工作流 -- java运用

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、 什么是工作流 以请假为例&#xff0c;现在大多数公司的请假流程是这样的 员工打电话&#xff08;或网聊&#xff09;向上级提出请…

linux命令 ps -ef 的含义

PS是LINUX下最常用的也是非常强大的进程查看命令//以下这条命令是检查java 进程是否存在. ps -ef |grep java下面对命令选项进行说明&#xff1a;-e 显示所有进程。-f 全格式。ps -e 列出程序时&#xff0c;显示每个程序所使用的环境变量。ps -f 用ASCII字符显示 树状结构 &…

vue-i18n使用及踩坑记录

使用步骤 1. 安装 npm i vue-i18n 2. vue-cli下使用 //1. 引入 vue-i18n import Vue from vue import VueI18n from vue-i18n Vue.use(VueI18n)//2. 定义messages const messages {en: {text: {hello: hello world}},zh: {text: {hello: 你好、世界}} }//如果messages字段很多…