题意: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 最长反链相关推荐

  1. BZOJ 1143 祭祀river 最长反链

    http://vfleaking.blog.163.com/blog/static/1748076342012918105514527/大前提:在有向无环图中链是一个点的集合,这个集合中任意两个元素v ...

  2. 最长反链(bzoj 1143: [CTSC2008]祭祀river)

    题目描述: 给你一个n个点m条边的有向无环图,求出最大点集满足其中任意两点间都不能存在路径 也就是对于所有的x, y∈S,x不能到达y,y也不能到达x 对于有向无环图(DAG): 链:一些点的集合,链 ...

  3. BZOJ.1143.[CTSC2008]祭祀(Dilworth定理 最大流ISAP)

    题目链接 题目是求最长反链,反链指点集内任意两点不能互相到达. 根据Dilworth定理,在DAG中,\[最长反链 = 最小路径覆盖 = V - 最大匹配数\] 用Floyd求一遍传递闭包后,在所有可 ...

  4. 【BZOJ3997】[TJOI2015]组合数学 最长反链

    [BZOJ3997][TJOI2015]组合数学 Description 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格 ...

  5. bzoj 2654 bzoj 3675 总结

    bzoj 2654 && bzoj 3675 总结 手动博客搬家: 本文发表于20180929 15:18:55, 原地址https://blog.csdn.net/suncongbo ...

  6. 最小路径覆盖与最小链覆盖 Dilworth定理:最小链覆盖等于最长反链(详细证明与经典例题)

    一.最小路径覆盖 定义 最小路径覆盖就是指在有向无环图中,用最少的.不相交的简单路径覆盖图中的所有点. 解法 ①将原图中的每个点拆点,(将点u拆成u与u+n): ②将原图中的每条边 <u,v&g ...

  7. 最长反链=最小链覆盖(证明+解析)

    最长反链与最小链覆盖 转自:http://vfleaking.blog.163.com/blog/static/1748076342012918105514527/ 膜拜! 大前提:在有向无环图中 链 ...

  8. [bzoj1143][CTSC2008]祭祀river——DAG上最长反链,Dilworth定理,最大二分图匹配,Floyd

    题目大意: 给定一个DAG图,求最长反链(即一个点集,其中任意点两两不可以相互到达). 思路: 一开始我其实是想用求最大独立集的方法去求的.但是并不会(好像也过不去). 题目所要求的是最长反链,需要用 ...

  9. 纸飞机【最小链覆盖等于最长反链】

    牛客挑战赛36 C 题目链接 题目想知道的是最长严格下降子序列的最少个数用以覆盖完N个数.也就是最小链覆盖问题了. 那么,我们反过来想,最长反链,我们求得最长不递减序列的个数,如题,"2 4 ...

最新文章

  1. python3写unicode编码到文件
  2. ArduinoYun教程之Arduino环境与Linux环境的桥梁Bridge
  3. 非专业转行python的几点建议
  4. 内附PPT下载 | 阿里云资深技术专家 陈长城:一站式数据管理DMS及最新解决方案解读
  5. oracle to char trim,to_char前面多出空格
  6. Mybatis if test中字符串比较
  7. 第十五节20181209
  8. 工作中windows客户端常见问题
  9. Julia: @generated=多姿多彩!
  10. mysql存储多少_MySQL存储引擎你们知道多少?
  11. 虚拟机WIN7系统 如何设置网络
  12. 保姆级win10纯净系统安装 数字权利激活工具 / KMS激活 + U盘启动盘制作
  13. 2、通信中的交换技术
  14. mysql获取某个最大的值的一行数据_某一字段分组取最大(小)值所在行的数据
  15. python 存根_如何用Python编写类方法的存根
  16. 不要为明天忧虑(10.14)
  17. App逆向|一个案例教你如何进行APP逆向
  18. C++全角与半角互转
  19. [前端框架]-VUE(下篇)
  20. UVM:解决phase的执行顺序

热门文章

  1. 《计算机视觉技术与应用》-----第二章 图像处理基础
  2. 安装Oracle RAC数据库前的准备工作
  3. 裸奔系列之博科SAN交换机(1)---SAN交换机产品介绍
  4. 对电路设计,IC设计,PCB板设计的初步认识
  5. 微信红包接入2-项目集成
  6. PanDownload 一款好用的百度网盘下载工具 突破下载网速限制
  7. FMC子卡:4 路 SFP+万兆光纤网络 FMC 子卡
  8. process.env.NODE_ENV与@vue/cli-service及其.env.*默认外部环境配置文件之跨域部署
  9. JavaScript网页编程_API和WebAPI
  10. 求N个数的最大公因数(算法)