题目

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),表示vv是uu的的上司。
题目要让我们在图上找到尽量多的点,使得这些点不能互相到达。
咋做?
题解上这样说:

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

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

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

  1. JZOJ 5281. 【NOIP提高组模拟A组8.15】钦点

    Description Input Output Sample Input 4 4 2 a a b b a a b b c c d d c c d d 1 1 3 3 2 2 3 1 1 3 2 2 ...

  2. 【二分,找规律】Day 14 提高组模拟C组 T1 小麦亩产一千八

    题目大意 给定斐波那契的第aaa项,求出第b" role="presentation">bbb项,默认第0项为1 解题思路 方法一:递推 找到规律后O(b)O(b) ...

  3. 2018.12.08【NOIP提高组】模拟B组总结(未完成)

    2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...

  4. 5814. 【NOIP提高A组模拟2018.8.14】 树(期望 + 倍增)

    5814. [NOIP提高A组模拟2018.8.14] 树 Problem 给定一棵nnn个点的树,m" role="presentation">mmm次询问,每次 ...

  5. JZOJ 5814. 【NOIP提高A组模拟2018.8.14】 树

    梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中等概率地选择一条走过去, ...

  6. 第一届『Citric杯』NOIP提高组模拟赛 题解

    [官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...

  7. {小结}2016.6.11【初中部 NOIP提高组 】模拟赛C

    2016.6.11[初中部 NOIP提高组 ]模拟赛C No.1!!! 100+33.3+10+90=233.3 23333 1298. 牛棚(graze2.pas/c/cpp) 题解 1299. 洗 ...

  8. 2021.01.14【NOIP提高B组】模拟 总结

    2021.01.14[NOIP提高B组]模拟 总结 第一题 Candy 奇奇怪怪的题目. 一开始没有理解题目,其实就是同时变换. 打了一个暴力. 本人随机生成50000组数据,都过了,时间没超.希望出 ...

  9. 2020.08.08【NOIP提高组】模拟:奶牛的图片 总结

    2020.08.08[NOIP提高组]模拟:奶牛的图片 总结 Description Farmer John希望给他的 N ( 1 ≤ N ≤ 100 , 000 ) N(1\leq N\leq100 ...

最新文章

  1. 30 篇亮点论文、5 大主题带你一览 ECCV 2020研究趋势
  2. 把控制台程序嵌入到 WinForm 中执行
  3. MySql根据经纬度查询任意距离范围内数据
  4. ASP.Net中无刷新执行Session身份验证
  5. Java中的13个原子操作类介绍
  6. (转)最强Android模拟器genymotion的安装与配置
  7. Delphi2010 RTTI + Attribute 简单实现ORM实例
  8. cat >> ipconf << EOF > EOF是什么意思
  9. opencv python3 找图片不同_使用OpenCV和Python查找图片差异
  10. 常用RF连接器SMA/SMB/SMP/MMCX/BNC/TNC/2.92/2.4
  11. java面试erp项目经验_ERP项目经验总结
  12. CAD如何绘制六连环图案?CAD使用圆,椭圆,直线综合练习
  13. 学生电影网页设计作品 影视主题学生网页制作 简单网页设计作业 静态影视介绍网页模板
  14. 南京大学计算机专业复试面试,南大计算机面试问题汇总及部分答案.doc
  15. JavaScript对象 1
  16. 面试时,HR问你职业规划,教你如何回答,得100分!
  17. 【面试】896- 助力春招!2021 阿里字节快手新鲜面经
  18. 部分MacBook Pro突然无法充电,电量为什么显示为1%
  19. 解决idea显示properties文件中文乱码
  20. 如何利用工具批量删除百度网盘单向好友

热门文章

  1. 【牛客 - 369C】小A与欧拉路(bfs树的直径)
  2. 【HDU - 3746 】Cyclic Nacklace (KMP,最小循环节问题)
  3. php中pregmatch,php中preg_match的isU代表什么意思
  4. android volume挂载流程,Android SDCard UnMounted 流程分析(一)
  5. 计算两个日期间隔天数(距离(2024-7-7)间隔:1999天)
  6. 在循环递增一次的数组中插入元素
  7. n位数的全排列(需要考虑大数的情况)
  8. leetcode117. 填充每个节点的下一个右侧节点指针 II
  9. 《Head First设计模式》读书笔记_第一章
  10. opencv findContours 报错_acrt_first_block == header