经典问题 1 —— DAG 上区间限制拓扑序

问题描述

给定一个 DAG,求一个拓扑序,使得节点 i 的拓扑序 [li,ri]

题解

首先进行一个预处理:对于所有 u,令 (v,u)E,lumax(lu,lv+1),(u,v)E,rumin(ru,rv1)

也就是 lu 对任何可能的拓扑序的最小值取 maxru 同理。若此时有节点 lu>ru 则无解。

将所有区间按 r 端点排序,然后以 l 端点为关键字插入大根堆中。从大到小依次考虑拓扑序 i 应为哪个节点,将所有 rui 的节点插入堆中,然后取出 lu 最大的,若 lu>i 则显然无解,否则直接令 topoi=u,弹堆。由贪心交换性质应该可以证明这是可能的最优情况,如果这样都无解那么一定无解。至于正确性,我们发现如果当前存在 j>i 使得 (topoj,topoi)E,则会有 ltopo[i]>ltopo[j],与每次取出 l 最大的区间矛盾。

本文作者:CharlieVinnie

本文链接:https://www.cnblogs.com/Charlie-Vinnie/p/17067583.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   CharlieVinnie  阅读(60)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起