题目

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)" role="presentation">(u,v)(u,v),表示v" role="presentation">vv是u" role="presentation">uu的的上司。

题目要让我们在图上找到尽量多的点,使得这些点不能互相到达。

咋做?

题解上这样说:

在有向无环图中,我们定义:

链:图上一些点的集合,对于链上任意两个点 x、y,满足 x 能到达 y 或者 y

能到达 x。

反链:图上一些点的的集合,对于反链上任意两个点 x、y,满足 x 不能到达

y 并且 y 不能到达 x。

所以就是很显然的求最长反链长度了~

有以下 Dilworth 定理:

最长反链长度=最小链覆盖(选取最少的链覆盖所有的点)

这是题解上话,然后我上网找这条定理的证明,结果……证明很少,并且好几篇博客是一个样子,而且让我一脸懵逼,甚至感觉那证明还是错的……

于是,只能感性理解。

假设用一些链来覆盖整张图。

对于每个反链上的点,它们各自在一条链上。

如果这些链的数量大于最小链覆盖,那么多出来的那些都是废的,会出现两个反链上的点能连通,与题目不符……

好吧,感性理解这种东西是不方便用语言来说的。

现在假设我们已经知道了这个定理。

接下来可以用二分图匹配来解决:

将每个点拆成左右两边(实现时不需要)。

对于一条边(u,v)" role="presentation">(u,v)(u,v),就在二分图上uleft" role="presentation">uleftuleft和vright" role="presentation">vrightvright连一条有向边。

跑一遍二分图匹配,那么答案就是n−最大匹配数" role="presentation">n−最大匹配数n−最大匹配数。

Why?

在二分图,连一条边,可以视为将两条链合并,也就是将最小链覆盖数−1" role="presentation">−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;
}

总结

这题好打是好打,就是理解得迷迷糊糊的。

感性理解还是很重要的……

JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会的更多相关文章

  1. [jzoj 5770]【2018提高组模拟A组8.6】可爱精灵宝贝 (区间dp)

    传送门 Description Branimirko是一个对可爱精灵宝贝十分痴迷的玩家.最近,他闲得没事组织了一场捉精灵的游戏.游戏在一条街道上举行,街道上一侧有一排房子,从左到右房子标号由1到n. ...

  2. 5820. 【NOIP提高A组模拟2018.8.16】 非法输入(模拟,字符串)

    5820. [NOIP提高A组模拟2018.8.16] 非法输入 (File IO): input:aplusb.in output:aplusb.out Time Limits: 1000 ms   ...

  3. JZOJ 5818. 【NOIP提高A组模拟2018.8.15】 做运动

    5818. [NOIP提高A组模拟2018.8.15] 做运动 (File IO): input:running.in output:running.out Time Limits: 2000 ms  ...

  4. JZOJ 5812. 【NOIP提高A组模拟2018.8.14】 区间

    5812. [NOIP提高A组模拟2018.8.14] 区间 (File IO): input:range.in output:range.out Time Limits: 1000 ms  Memo ...

  5. 2018.12.30【NOIP提高组】模拟赛C组总结

    2018.12.30[NOIP提高组]模拟赛C组总结 今天成功回归开始做比赛 感觉十分良(zhōng)好(chà). 统计数字(count.pas/c/cpp) 字符串的展开(expand.pas/c ...

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

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

  7. 计蒜客 NOIP 提高组模拟竞赛第一试 补记

    计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...

  8. [NOIP提高组2018]货币系统

    [TOC] 题目名称:货币系统 来源:2018年NOIP提高组 链接 博客链接 CSDN 洛谷博客 洛谷题解 题目链接 LibreOJ(2951) 洛谷(P5020) 大视野在线评测(1425) 题目 ...

  9. 2021.04.24【NOIP提高B组】模拟 总结

    2021.04.24[NOIP提高B组]模拟 总结 T1 题意:有一圈数.两两之间有加法或乘法操作, 问你开始断掉那条边使得剩下的序列经过某种操作后的值最大 看上去是个区间 dp .然后直接断环成列, ...

随机推荐

  1. SQL Server - SQL Server/ bcp 工具如何通信

    问题-BCP通讯 ref: https://stackoverflow.com/questions/40664708/bcp-cannot-connect-to-aws-sql-server-but- ...

  2. 校园商铺-2项目设计和框架搭建-8升级mysql驱动相关的配置以支持mysql8

    1.如何升级驱动 1.1步骤: a 确保当前程序能正常访问数据库 b 更新mysql驱动重新运行程序进行校验 maven依赖https://mvnrepository.com/artifact/mys ...

  3. python中循环引用导致内存泄漏小案例

    首先定义一个Person类和一个Dog类,然后分别实例化对象p和d,给p对象添加一个pet属性 给d对象添加一个master属性此时Person和Dog的应用计数都为2,当del p 和del d后P ...

  4. csp-s模拟测试83(集训过半)

    csp-s模拟测试83(集训过半) 一场信心赛.起初$OJ$爆了我就看见全场$A$了$T1$并且夹杂着$A$掉$T2$我就很难受. 这场比赛没有深入思考,很失败,一个多小时后就结束了我罪恶的一生. 0 ...

  5. 最全的机器学习&深度学习入门视频课程集

    资源介绍 链接:http://pan.baidu.com/s/1kV6nWJP 密码:ryfd     链接:http://pan.baidu.com/s/1dEZWlP3 密码:y82m 更多资源 ...

  6. virtualbox导入winXP系统OVA文件重启

    1,开启虚拟机 2,按f8进入安全模式,然后修改注册表: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Processor HKEY_LOC ...

  7. 锐速与BBR的原理简单解析

    锐速与BBR的原理简单解析  4 前言 昨天,有一位朋友在我的文章下留言说,锐速和BBR不都是一样,是拥塞算法嘛.因为这方面需要讲的东西比较多,所以我还是专门水一篇文章吧. 锐速 参考资料: http ...

  8. python3 selenium 超时停止加载,并且捕捉异常, 进行下一步【亲测有效】

    from selenium import webdriver import os import re class GetPage: def __init__(self, url_path): self ...

  9. JavaWeb实现文件下载

    1. 编写文件上传Servlet public class FileUpload1 extends HttpServlet { @Override protected void doGet(HttpS ...

  10. leetcode-第5周双周赛-1136平行课程

    方法一: class Solution(object): def minimumSemesters(self, N, relations): """ :type N: i ...