bzoj 1143 bzoj 2718 最长反链
题意:n个点,m条有向边,求最长反链
又到了涨姿势的时候了...(果然蒟蒻)
DAG中,有如下的一些定义和性质:
链:一条链是一些点的集合,链上任意两个点x, y,满足要么 x 能到达 y ,要么 y 能到达 x 。
反链:一条反链是一些点的集合,链上任意两个点x, y,满足 x 不能到达 y,且 y 也不能到达 x。
一个定理:最长反链长度 = 最小链覆盖(用最少的链覆盖所有顶点)
对偶定理:最长链长度 = 最小反链覆盖
那么我们要求出的就是这个有向无环图的最小链覆盖了。
最小链覆盖即路径可以相交的最小路径覆盖。
先看路径不能相交的最小路径覆盖怎么来做:
建立一个二分图,两边都是n个点,原图的每个点 i 对应两个,在左边的编号 i, 在右边的编号 n+i。
原图中如果存在一条边 (x, y),那么就在二分图中连一条 (x1, y2) 的边。
则 原图的最小路径覆盖(路径不能相交)= n-二分图最大匹配
那么路径可以相交的最小路径覆盖(最小链覆盖)呢?
将原图做一次Floyd传递闭包,得出x是否能到达y
如果两个点 x, y,满足 x 可以到达 y ,那么就在二分图中建立边 (x1, y2) 。
这里与上面不同,只要 x 能到达 y ,就直接连一条边 (x, y),
然后就转化为了路径不能相交的最小路径覆盖了。
即 原图的最小链覆盖 = n -二分图最大匹配
bzoj 1143
varn,m,x,y,ans,l :longint;i,j :longint;map :array[0..110,0..110] of boolean;link,last :array[0..210] of longint;flag :array[0..210] of boolean;pre,other :array[0..10010] of longint;procedure floyd;
vari,j,k:longint;
beginfor k:=1 to n dofor i:=1 to n dofor j:=1 to n domap[i,j]:=(map[i,k] and map[k,j]) or map[i,j];
end;procedure connect(x,y:longint);
begininc(l);pre[l]:=last[x];last[x]:=l;other[l]:=y;
end;function find(x:longint):boolean;
varp,q:longint;
beginq:=last[x];while (q<>0) dobeginp:=other[q];if not flag[p] thenbeginflag[p]:=true;if (link[p]=0) or (find(link[p])) thenbeginlink[p]:=x;exit(true);end;end;q:=pre[q];end;exit(false);
end;beginread(n,m);for i:=1 to m dobeginread(x,y);map[x,y]:=true;end;floyd;for i:=1 to n dofor j:=1 to n doif map[i,j] then connect(i,n+j);ans:=0;for i:=1 to n dobeginfillchar(flag,sizeof(flag),false);if find(i) then inc(ans);end;ans:=n-ans;writeln(ans);
end.
bzoj 2718
varn,m,x,y,ans,l :longint;i,j :longint;map :array[0..210,0..210] of boolean;pre,other :array[0..40010] of longint;flag :array[0..410] of boolean;last,link :array[0..410] of longint;
procedure connect(x,y:longint);
begininc(l);pre[l]:=last[x];last[x]:=l;other[l]:=y;
end;procedure floyd;
vari,j,k:longint;
beginfor k:=1 to n dofor i:=1 to n dofor j:=1 to n domap[i,j]:=map[i,j] or (map[i,k] and map[k,j]);
end;function find(x:Longint):boolean;
varp,q:longint;
beginq:=last[x];while (q<>0) dobeginp:=other[q];if not flag[p] thenbeginflag[p]:=true;if (link[p]=0) or find(link[p]) thenbeginlink[p]:=x;exit(true);end;end;q:=pre[q];end;exit(false);
end;beginread(n,m);for i:=1 to m dobeginread(x,y);map[x,y]:=true;end;floyd;for i:=1 to n dofor j:=1 to n doif map[i,j] then connect(i,n+j);//ans:=0;for i:=1 to n dobeginfillchar(flag,sizeof(flag),false);if find(i) then inc(ans);end;writeln(n-ans);
end.
——by Eirlys
bzoj 1143 bzoj 2718 最长反链相关推荐
- BZOJ 1143 祭祀river 最长反链
http://vfleaking.blog.163.com/blog/static/1748076342012918105514527/大前提:在有向无环图中链是一个点的集合,这个集合中任意两个元素v ...
- 最长反链(bzoj 1143: [CTSC2008]祭祀river)
题目描述: 给你一个n个点m条边的有向无环图,求出最大点集满足其中任意两点间都不能存在路径 也就是对于所有的x, y∈S,x不能到达y,y也不能到达x 对于有向无环图(DAG): 链:一些点的集合,链 ...
- BZOJ.1143.[CTSC2008]祭祀(Dilworth定理 最大流ISAP)
题目链接 题目是求最长反链,反链指点集内任意两点不能互相到达. 根据Dilworth定理,在DAG中,\[最长反链 = 最小路径覆盖 = V - 最大匹配数\] 用Floyd求一遍传递闭包后,在所有可 ...
- 【BZOJ3997】[TJOI2015]组合数学 最长反链
[BZOJ3997][TJOI2015]组合数学 Description 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格 ...
- bzoj 2654 bzoj 3675 总结
bzoj 2654 && bzoj 3675 总结 手动博客搬家: 本文发表于20180929 15:18:55, 原地址https://blog.csdn.net/suncongbo ...
- 最小路径覆盖与最小链覆盖 Dilworth定理:最小链覆盖等于最长反链(详细证明与经典例题)
一.最小路径覆盖 定义 最小路径覆盖就是指在有向无环图中,用最少的.不相交的简单路径覆盖图中的所有点. 解法 ①将原图中的每个点拆点,(将点u拆成u与u+n): ②将原图中的每条边 <u,v&g ...
- 最长反链=最小链覆盖(证明+解析)
最长反链与最小链覆盖 转自:http://vfleaking.blog.163.com/blog/static/1748076342012918105514527/ 膜拜! 大前提:在有向无环图中 链 ...
- [bzoj1143][CTSC2008]祭祀river——DAG上最长反链,Dilworth定理,最大二分图匹配,Floyd
题目大意: 给定一个DAG图,求最长反链(即一个点集,其中任意点两两不可以相互到达). 思路: 一开始我其实是想用求最大独立集的方法去求的.但是并不会(好像也过不去). 题目所要求的是最长反链,需要用 ...
- 纸飞机【最小链覆盖等于最长反链】
牛客挑战赛36 C 题目链接 题目想知道的是最长严格下降子序列的最少个数用以覆盖完N个数.也就是最小链覆盖问题了. 那么,我们反过来想,最长反链,我们求得最长不递减序列的个数,如题,"2 4 ...
最新文章
- python3写unicode编码到文件
- ArduinoYun教程之Arduino环境与Linux环境的桥梁Bridge
- 非专业转行python的几点建议
- 内附PPT下载 | 阿里云资深技术专家 陈长城:一站式数据管理DMS及最新解决方案解读
- oracle to char trim,to_char前面多出空格
- Mybatis if test中字符串比较
- 第十五节20181209
- 工作中windows客户端常见问题
- Julia: @generated=多姿多彩!
- mysql存储多少_MySQL存储引擎你们知道多少?
- 虚拟机WIN7系统 如何设置网络
- 保姆级win10纯净系统安装 数字权利激活工具 / KMS激活 + U盘启动盘制作
- 2、通信中的交换技术
- mysql获取某个最大的值的一行数据_某一字段分组取最大(小)值所在行的数据
- python 存根_如何用Python编写类方法的存根
- 不要为明天忧虑(10.14)
- App逆向|一个案例教你如何进行APP逆向
- C++全角与半角互转
- [前端框架]-VUE(下篇)
- UVM:解决phase的执行顺序
热门文章
- 《计算机视觉技术与应用》-----第二章 图像处理基础
- 安装Oracle RAC数据库前的准备工作
- 裸奔系列之博科SAN交换机(1)---SAN交换机产品介绍
- 对电路设计,IC设计,PCB板设计的初步认识
- 微信红包接入2-项目集成
- PanDownload 一款好用的百度网盘下载工具 突破下载网速限制
- FMC子卡:4 路 SFP+万兆光纤网络 FMC 子卡
- process.env.NODE_ENV与@vue/cli-service及其.env.*默认外部环境配置文件之跨域部署
- JavaScript网页编程_API和WebAPI
- 求N个数的最大公因数(算法)