[BZOJ1143][CTSC2008]祭祀river(Dilworth定理+二分图匹配)
题意:给你一张n个点的DAG,最大化选择的点数,是点之间两两不可达。
要从Dilworth定理说起。
Dilworth定理是定义在偏序集上的,也可以从图论的角度解释。偏序集中两个元素能比较大小,则在图中连一条有向边。
定义反链为一个点集,满足集合中的点两两不可达。
Dilworth定理:最小路径覆盖=最长反链。
证明:http://vfleaking.blog.163.com/blog/static/1748076342012918105514527/
例子:NOIP1999第二问:给定一个数列a,将其分成若干个子序列,使每个子序列都是下降子序列,并最小化分的子序列个数。
对于所有i<j且a[i]>a[j],从i向j连边,则问题转化成求图的最小路径覆盖,根据Dilworth定理进一步转化为求最长反链,而这里的最长反链即是最长不降子序列的长度。所以这题只要求一个最长不降子序列即可。
回到这道题,就是要求一个最长反链。这里任意两个可达的点之间都需要连一条边,所以需要求传递闭包。
然后通过Dilworth定理转化为求DAG的最小路径覆盖,这就是二分图匹配的经典问题了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=;
int n,m,u,v,ans,lk[N];
bool mp[N][N],a[N][N],vis[N]; bool find(int x){
rep(i,,n) if (!vis[i] && mp[x][i]){
vis[i]=;
if (!lk[i] || find(lk[i])) { lk[i]=x; return ; }
}
return ;
} int main(){
freopen("bzoj1143.in","r",stdin);
freopen("bzoj1143.out","w",stdout);
scanf("%d%d",&n,&m);
rep(i,,m) scanf("%d%d",&u,&v),mp[u][v]=;
rep(k,,n) rep(i,,n) rep(j,,n) mp[i][j]|=mp[i][k]&mp[k][j];
rep(i,,n) rep(j,,n) if (i!=j && mp[i][j]) a[i][j]=;
rep(i,,n){
memset(vis,,sizeof(vis));
if (find(i)) ans++;
}
printf("%d\n",n-ans);
return ;
}
[BZOJ1143][CTSC2008]祭祀river(Dilworth定理+二分图匹配)的更多相关文章
- BZOJ1143 [CTSC2008]祭祀river 【二分图匹配】
1143: [CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3236 Solved: 1651 [Submit] ...
- BZOJ1143 [CTSC2008]祭祀river 二分图匹配 最小链覆盖
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1143 题意概括 给出一个有向图.求最小链覆盖. 题解 首先说两个概念: 链:一条链是一些点的集合, ...
- 【Floyd】【Dilworth定理】【最小路径覆盖】【匈牙利算法】bzoj1143 [CTSC2008]祭祀river
Dilworth定理,将最长反链转化为最小链覆盖.//貌似还能把最长上升子序列转化为不上升子序列的个数? floyd传递闭包,将可以重叠的最小链覆盖转化成不可重叠的最小路径覆盖.(引用:这样其实就是相 ...
- bzoj1143: [CTSC2008]祭祀river 最长反链
题意:在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河道连 ...
- Codeforces 590E - Birthday(AC 自动机+Dilworth 定理+二分图匹配)
题面传送门 AC 自动机有时只是辅助建图的工具,真的 首先看到多串问题,果断建出 AC 自动机.设 \(m=\sum|s_i|\). 不难发现子串的包含关系构成了一个偏序集,于是我们考虑转化为图论,若 ...
- [BZOJ1143][CTSC2008]祭祀river(最长反链)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1143 分析: 最长反链==最小路径覆盖==n-二分图最大匹配数 某神犇对二分图的总结: ...
- bzoj1143: [CTSC2008]祭祀river && bzoj27182718: [Violet 4]毕业旅行
其实我至今不懂为啥强联通缩点判入度会错... 然后这个求的和之前那道组合数学一样,就是最长反链=最小链覆盖=最大独立集. #include<cstdio> #include<iost ...
- BZOJ1143: [CTSC2008]祭祀river 网络流_Floyd_最大独立集
Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都 会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组 ...
- BZOJ1143 [CTSC2008] 祭祀river
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1143 题目大意: 给你n个点,点与点之间由有向边相连.如果u能到达v的话,那么他们就不能同 ...
随机推荐
- jsp电子商务 购物车实现之二 登录和分页篇
登录页面核心代码 <div id="login"> <h2>用户登陆</h2> <form method="post" ...
- java AWT repaint paint update 方法
paint(Graphic g): awt调用这个方法有2种形式.程序驱动方式和系统驱动方式. 在系统驱动的情况下(比如界面第一次显示组件),系统会判断组件的显示区域,然后向事件分发线程发出调用pai ...
- Educational Codeforces Round 55:B. Vova and Trophies
B. Vova and Trophies 题目链接:https://codeforc.es/contest/1082/problem/B 题意: 给出一个“GS”串,有一次交换两个字母的机会,问最大的 ...
- HDU3038:How Many Answers Are Wrong(带权并查集)
How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- 使用记事本创建Web服务(WebService)
学习就要从最简单最直观的地方入手. 1)打开记事本,添加如下代码: <%@ WebService Language="C#" Class="myFirstWebSe ...
- React.js基础知识
一. react.js的基本使用方法 (1)快速使用,hello world <div id="app"></div> <script src=&qu ...
- Struts2 内建的验证规则
Struts2 内建的验证规则 conversion validator:转换验证器 date validator:日期验证器 double validator:浮点验证器 email validat ...
- 【BZOJ3132】上帝造题的七分钟 [树状数组]
上帝造题的七分钟 Time Limit: 20 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description “第一分钟,X说,要有矩阵 ...
- NOIP2005过河(青蛙过河)
题目传送门 这道题主要是因为L长度最大可以为1e9 而石子却最多只有100个 这样就浪费了很多时间空间 所以我们压缩一波路径就可以了 剩余的就是枚举每个点以及i-y到i-x的dp了 这里要说一句为什么 ...
- Codeforces 542C - 漫长艰辛的解题历程
尽管在下面的一部分解题的方法都有问题... 但是每一次重新提交都是打了一个有意义的补丁的呢 可见在我做题的过程中有多少问题存在... 现在想想,类似于是变量没有开int64,过程函数忘开int64.. ...