![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
拓补排序
EMber _
人但有追求,世界亦会让路。
展开
-
bzoj4010 [HNOI2015]菜肴制作 拓补排序+堆
反过来连边,跑拓补序列,用堆维护,然后按照排序的倒序输出就好了。 正确性显然,不懂得话手推一下。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<queue>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(原创 2017-04-23 09:41:19 · 256 阅读 · 0 评论 -
bzoj3887 [Usaco2015 Jan]Grass Cownoisseur tarjan+拓补排序
题意不说了。 %%%popoqqq 既然没有要求一条边不能被经过两次,那么在强连通分量内的所有点都有贡献,所以先缩点,这个挺显然的。 问题是这个逆边要怎么选,,有一个明显结论 将某条边反向后 缩点之后的图形成了一个包含1号节点所在强连通分量的环 这样才能使答案增加 把这个环从反向的边和1号节点所在的强连通分量断开,一条路是从1到n,另外一条是从n到1. 那么我们缩点以后拓补排序一下,把正原创 2017-07-19 10:38:06 · 671 阅读 · 0 评论 -
bzoj4484[Jsoi2015]最小表示 拓补排序+bitset
挺显然的吧,一条边没有影响当且仅当这个边相连的两个点已经可以互相到达,就是没想到用bitset维护,老纠结map。。。#include<cstdio>#include<algorithm>#include<cstring>#include<bitset>#include<queue>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,原创 2017-07-28 10:02:17 · 264 阅读 · 0 评论 -
bzoj1093[ZJOI2007]最大半连通子图 tarjan+拓补排序
这是一个看懂题目就能切的题。 题意:给你个图,求最长路。 怎么样,是不是被震惊到了。。。其实就这么简单。。 由于原图可能有scc,我们需要tarjan处理掉,然后就是最长路了,由于并不固定起点,我们拓补排序的同时去更新最长路,也可说是DP吧,记录一下到达每个点的方法数,这个也很好记录。 1A,爽。#include<cstdio>#include<algorithm>#include<cs原创 2017-10-27 08:23:25 · 233 阅读 · 0 评论 -
Atcoer Grand Contest 001 F 拓补排序 STL
题意:给定一个1⋯n的排列{pi},给定一个K,对于pi=pj+1且|i−j|≥K可以交换pi和pj的值,求经过变换可以得到的最小的字典序。神题= =完全没什么想法,没想到暴力90分,数据水的不行了。 首先做出原序列的对应序列,设为q[i]。 对于q[i],所有满足|i−j|<=K且pi<=pj|i-j|<=K且pi<=pj的,连边求出最小字典序就是答案。 这样子连边复杂度是n^2。 怎么优原创 2017-10-12 15:46:24 · 444 阅读 · 0 评论 -
bzoj2109 [Noi2010]Plane 航空管制 贪心 拓补排序
题意:定义一个航班的起 飞序号为该航班在起飞序列中的位置,即是第几个起飞的航班。 起飞序列还存在两类限制条件: 第一类(最晚起飞时间限制):编号为 i的航班起飞序号不得超过 ki; 第二类(相对起飞顺序限制):存在一些相对起飞顺序限制(a, b),表示 航班 a的起飞时间必须早于航班 b。求每个飞机在可行的起飞序列中最小的那个数。拓补很显然,但是直接连边比较难以处理第二种限制,于是我们显然想原创 2017-11-06 17:21:05 · 362 阅读 · 0 评论