
拓扑排序
Icefox_zhx
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
luogu1983【2013普及】车站分级(拓扑排序)
每一趟列车,没停靠的站的分级一定比停靠了的小,我们从停靠的站向没停靠的站建一条有向边,显然是个DAG,我们进行拓扑排序,看分成几个阶段(把栈内所有上次的点都删掉算一次。)。就是答案。原创 2017-09-14 13:49:13 · 550 阅读 · 0 评论 -
bzoj2938 [POI2000]病毒(ACAM+拓扑序判环)
问是否存在一个无限长的串不包含任意模式串。 那么我们建出ACAM,删去所有不能走的点(即模式串结尾),看是否存在一个环,如果存在则可以。可以用拓扑序来判环。原创 2018-03-23 10:34:49 · 278 阅读 · 0 评论 -
bzoj3832 [Poi2014]Rally(拓扑排序+堆)
非常厉害的思路. 设f[i],g[i]分别表示从起点到i的最长路径和从点i开始的最长路径. 这个显然可以用拓扑排序处理. 对于一条边(u,v),它能产生的最长路径是f[u]+g[v]+1 我们用一个可删除堆来维护当前所有合法边产生的最长路径的最大值. 首先把g[i]数组加入线段树.按拓扑序依次枚举每一个点. 把指向它的边产生的最长路径和从这个点开始的最长路径从堆中删除. 当前全局最大值就原创 2018-04-08 23:17:19 · 381 阅读 · 0 评论 -
poj3683 Priest John's Busiest Day(2-sat)
2-sat,需要输出方案。我们tarjan缩点之后,建新图时建反图,方便我们倒着拓扑序。 我们从底往上走,如果这个点i还未被选择/删除,就选择i,删除i’(这里我认为只需删除i’,而不需要去dfs删i’的前代,因为i’的前代一定是i的后代,而i的后代后已经做完了)然后按顺序输出即可。原创 2018-04-13 10:34:38 · 444 阅读 · 0 评论 -
bzoj1194 [HNOI2006]潘多拉的盒子(自动机+bfs+tarjan+拓扑序dp)
我们枚举每一对自动机A,B,看A能识别的所有串能否被B全都识别。如果能就建边A->B.那么我们tarjan缩点+拓扑序dp求最长链即可。 考虑如何判断能否全都识别:bfs,同时扩展两个自动机,如果某一个串在A自动机走到了结束节点而B自动机不是结束节点,那么就不能全部识别。以A,B自动机分别匹配到了哪个节点为状态,不重复搜,复杂度就是O(n2)O(n^2)的 因此总的复杂度就是O(S2n2)O(S原创 2018-04-23 09:50:12 · 256 阅读 · 0 评论 -
poj3648 Wedding(2-sat)
首先每个人一个标号,然后每个人分为0–和bride一侧 1–和groom一侧两个点。夫妻不能同侧,建边。有**的不能都是1,建边。然后规定groom必须为1,bride必须为0.我本来写对了,然而对着一个正确的程序调了半天【再见】原创 2018-04-13 15:22:04 · 202 阅读 · 0 评论 -
bzoj5280 [Usaco2018 Open]Milking Order(二分答案+拓扑排序)
二分答案,有环就不合法。输出方案拓扑序,来个优先队列确保字典序最小。原创 2018-04-21 15:45:50 · 840 阅读 · 0 评论 -
bzoj4383 [POI2015]Pustynia(线段树优化建图+拓扑序dp)
首先我们有朴素的想法,直接建图拓扑序,倒着dp求每个点的最小值即可。 然而这样建边可能是O(n2)O(n^2)的 我们考虑对于一条信息,我们新建一个节点p,大于的点我们向p连一条边权为1的边,小于的点p向它连一条边权为0的边。这样就好多了,然而最坏还是O(n2)O(n^2)的囧我们考虑k个大于的点把一个区间分成了至多k+1个区间,这k+1个连续的区间我们可以用线段树优化到O(logn)O(log原创 2018-04-26 17:46:53 · 351 阅读 · 0 评论 -
bzoj2707 [SDOI2012]走迷宫(期望dp+tarjan缩点+Gauss)
令f[i]表示从i到T的期望步数。 我们有转移f[x]=∑yf[y]du[x]+1f[x]=∑yf[y]du[x]+1f[x]=\sum_y\frac{f[y]}{du[x]}+1 因为存在环所以scc内只能Gauss来求。 于是我们先tarjan缩一波点,然后倒拓扑序dp即可。 f[T]=0. 如果s,t不连通那么输出inf,或者缩完点之后没有出度的点不止bel[T],那么输出inf。...原创 2018-05-26 22:14:51 · 480 阅读 · 0 评论 -
bzoj4011 [HNOI2015]落忆枫音(拓扑序dp+容斥原理+朱刘算法)
大爷题解传送:http://blog.youkuaiyun.com/popoqqq/article/details/45194103原创 2018-02-01 14:18:40 · 378 阅读 · 0 评论 -
bzoj3470 Freda’s Walk(期望dp+概率dp+拓扑序+数学)
先正着拓扑序一遍,求出p[i],表示从1出发到达i点的概率。 然后倒着拓扑序一遍,求出f[i],表示从i开始走的期望步数。 这时候的f[1]就是不删边时的期望步数了。 我们考虑如果删掉边x->y,w,对答案有什么影响。 显然对x之前的点是没有任何影响的。 原本的f[x]=(f[y]+1)∗w(x,y)+∑v(f[v]+1)∗w(x,v)sum[x]f[x]=\frac{(f[y]+1)*w原创 2018-01-13 23:20:00 · 430 阅读 · 0 评论 -
CF516B Drazil and Tiles(拓扑排序)
预处理出每个 . 邻近的 . 有多少个,即有几种方法覆盖这个 . 。然后用类似拓扑排序的方法,每次把只有一种方法覆盖的点覆盖,并更新临近的点。如果最后还剩下了 . ,说明无法完全覆盖,或者方案不止一个。原创 2017-09-15 10:14:52 · 1194 阅读 · 0 评论 -
bzoj2208 [Jsoi2010]连通数(tarjan缩点+拓扑排序+bitset传递闭包)
首先用tarjan缩点,重建图,变成DAG,然后拓扑排序+bitset传递闭包。原创 2017-09-15 11:07:03 · 479 阅读 · 0 评论 -
bzoj1924 [Sdoi2010]所驼门王的宝藏(tarjan缩点+拓扑排序+dp)
把每个点向它能到达的点连一条有向边,那么答案就是这个图的最长链。然后就是一个强连通分量缩点+拓扑排序dp求最长路的套路了。但是,边不能直接暴力连!比如 同一行可能会有好多横天门,然后 就爆掉了!!!其实如果一行有许多横天门,我们不需要对每个横天门都连许多边,因为同一行的横天门肯定是属于同一个强连通的,反正我们也要给他们缩点,所以我们只拿一个横天门出来做,让他去连边,对于同一行的横天门连双向边,其他门原创 2017-09-19 13:18:27 · 599 阅读 · 0 评论 -
bzoj4010 [HNOI2015]菜肴制作(拓扑排序+贪心)
一上来我们考虑正着贪心,发现不太正确。。。于是反着建图,反着贪心,也就是说,反过来之后,入度不为0的点一定不能最后做,我们在入度为0的点中选一个最大的搁在最后,让更小的更有机会放在前面。原创 2017-09-20 16:34:20 · 463 阅读 · 0 评论 -
NOIP2003提高组
2003提高 A.神经网络(拓扑模拟) B.侦探推理(字符串+模拟) 太恶心了,不会写。 C.加分二叉树(区间dp+树的遍历) 因为中序遍历是1~n,所以如果根是k的话,左子树一定是1~k-1,右子树一定是k+1~n。这样就可以区间dp了。顺道记一下跟,方便输出前序遍历 D.传染病控制(搜索+剪枝) 实质上相当于在每层选一条边砍掉,可以爆搜,加个最优性剪枝。注意一个点安全了,只要它的祖先原创 2017-11-18 15:40:10 · 700 阅读 · 0 评论 -
CF894E Ralph and Mushrooms(tarjan缩点+拓扑序dp+数学)
一个强连通内的边显然可以把它的价值完全压榨,其他的边只能过一次,所以我们tarjan求scc,缩成DAG,然后拓扑序dp求最长路。至于怎么算一条边的所有价值,数学搞吧。首先求出n∗(n+1)<=wn*(n+1)<=w的最大的n,然后价值就是n∗w−∑ni=1i∗(i+1)/2+wn*w-\sum_{i=1}^n i*(i+1)/2+w,也就是n∗w−n∗(n+1)∗(n+2)/6+wn*w-n*(n原创 2017-11-21 11:13:18 · 859 阅读 · 0 评论 -
bzoj5017 [Snoi2017]炸弹(tarjan缩点+拓扑序dp+线段合并+线段树优化建图)
首先我们可以发现每个点能引爆的炸弹是一个连续的区间。相邻的点能引爆的区间肯定不会相离。每个点向他能引爆的点连边,建出一张有向图,Tarjan缩点(一个scc内的点都可以互达,合并他们能到达的区间即可),然后拓扑序倒序dp即可。转移相当于线段合并。每个点记录他最后能引爆的区间,答案就是区间大小。 可是我们最坏情况有O(n2)O(n^2)条边,无论是时间上还是空间上都是无法接受的。还好我们每个点能连向原创 2017-12-22 22:07:41 · 1032 阅读 · 0 评论 -
bzoj1565 [NOI2009]植物大战僵尸(拓扑序+最大权闭合子图,最小割)
给出一些限制关系,我们先搞出哪些植物不可能被吃。假设僵尸不管能量,把能吃的都吃了,看哪些剩下来即可,可以用拓扑序来做。然后对于能吃到的植物导出的图,把边都反过来,就是求一个最大权闭合子图。用最小割求即可。原创 2018-01-03 16:21:21 · 340 阅读 · 0 评论 -
bzoj5288 [Hnoi2018]游戏(模拟+拓扑排序)
我们首先考虑把没有门隔开的点缩成一个点。如果i->i+1的钥匙<=i,那么从i+1一定走不到i及其左,因此先做i+1,也就是连边i+1->i,然后按拓扑序来做,如果i->i+1的钥匙>=i+1,那么从i一定走不到i+1及其右,因此先做i,也就是连边i->i+1. 每次类似区间合并去扩展,每个区间只会被最多合并两次,因此复杂度是O(n)O(n)O(n)的...原创 2018-06-10 22:31:47 · 462 阅读 · 0 评论