排序 解题报告 (偏序集 最小反链覆盖)

博客讲述了在解决排序问题时,遇到的偏序集概念及求解最小反链覆盖的问题。作者最初使用缩点和拓扑排序的方法导致错误,后来通过改进,发现只需将强连通分量视为链即可。由于tarjan算法栈溢出,作者通过百度搜索找到解决方案,并分享了g++编译时增大栈空间的方法。最后,作者提到将采用链式前向星来表示图,并反思考试中思考不周全的原因。
摘要由CSDN通过智能技术生成

标题上所说的偏序集(详见维基百科偏序集或我所转的那篇博文)什么的是今天 qw 告我的,我觉得非常厉害,Orz 一下。。

题目描述
  有N个数A1..AN,已知一些它们之间的大小关系,形如某个数不小于某个数。
Your Task
	把这N个数分成尽量少个集合,使得每个集合内的任意两个数的大小关系都是未知的。
输入文件
  第一行 N M 表示有N个数,M个大小关系。
  接下来M行,每行 i j 表示 Ai>=Aj。
输出文件
	一行包含一个整数,最少要分成多少个集合。
样例输入
  4 4
	1 2
  1 3
  1 4
  4 1
样例输出
  3
样例解释
  2 3在同一个集合,1在一个集合,4在一个集合。
数据约定
  20%:N<=18
  60%:N<=10000
  100%:N<=100000,M<=1000000

这道题考试的时候把 m <= 1000000 看成了 m <= 100000,再加上当时实在是太蠢了,竟然对每个块都拓扑排序了一遍,所以。。。wa 20 。

解法是什么呢?据 qw 所说的偏序集之类,此题明显是求一个偏序集的最小反链覆盖,而最小反链覆盖等于最长链。

先说我

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值