题目描述:给定一个DAG,求出允许移除最多K条边后的字典序最大的拓扑序列。思路:线段树,每次找入度不超过K的最大编号的顶点,将此顶点从图中移除,重复操作n次即可得到结果。吐槽:当时打BC的时候写出了一个直接贪心+拓扑排序的复杂度为O(n)的错误代码(当时还没有意识到是错误代码),交到hdu oj上居...
分类:
其他好文 时间:
2015-04-04 01:05:09
阅读次数:
245
要求在一个DAG中删去不多于k条边,使得拓扑序的字典序最大。
贪心策略:每次删去入度小于res的,序号尽量大的点的入边。
需要用线段树维护区间最小值。
代码:
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int N = 400000 +10;
const ...
分类:
编程语言 时间:
2015-04-03 09:32:36
阅读次数:
157
这题说的给了n个点m条边要求保证是一个有向无环图,可以删除至多k条边使得这个图的拓扑序的字典序最大,我们知道如果我们要排一个点的时候一定要考虑比他大的点是否可以、通过拆边马上拆出来,如果可以拆当然是拆,肯定保证字典序最大,如果不能拆,就不拆留着以后拆,当初这个比他大的点度数小于k的,最大是多少,这个...
分类:
其他好文 时间:
2015-03-29 13:33:31
阅读次数:
129
官方题解:
因为我们要求最后的拓扑序列字典序最大,所以一定要贪心地将标号越大的点越早入队。我们定义点i的入度为di。假设当前还能删去k条边,那么我们一定会把当前还没入队的di≤k的最大的i找出来,把它的di条入边都删掉,然后加入拓扑序列。可以证明,这一定是最优的。
具体实现可以用线段树维护每个位置的di,在线段树上二分可以找到当前还没入队的di≤k的最大的i。于是时间复杂度就是O((n+m)lo...
分类:
其他好文 时间:
2015-03-29 12:16:12
阅读次数:
132
题意:n个点m条有向边组成的有向无环图,可以最多删除k条边让他的拓扑序最大。输出最大的拓扑序。
思路:在以前的topsort中是入读为零的点入队列,这里有k次机会可以删除边,那么我就把所有入度<=k的点全入队列,用优先队列维护最大的点序列号,去掉点最大序列号的所有入边,将它加入到拓扑序中,这样贪心是最优的。...
分类:
其他好文 时间:
2015-03-29 10:55:34
阅读次数:
144
//这题可算是历经千辛万苦才算ac了
//建图,然后就拓扑序,
//还是官方的bc的题解出的好
//贪心取编号最大的点
//令du[i]<=k的i进入优先队列
//然后依次整就行了,
//每次取出的点,判断一下
//是否du[i]<=k,如果小于
//依次遍历与他相邻的点,
//在这些相邻的点中找到du[j]<=k
//且不在队列当中的i的值,
//开始用g++交题,一直TL...
分类:
其他好文 时间:
2015-03-29 09:30:03
阅读次数:
121
// Creat By 郭仔 2015年3月29日9:12:52
//画图演示一遍就能很好的理解了
/*题意:输入n, m,n表示26个大写字母组成的字母表中前n个字母,m表示将输入m对字母的大小关系式,
(ch1
(1)如果出现ch1 ch2则表示这n个字母是inconsistency。
(2)能确定有惟一这n个的字母的拓扑序。
*/
//(3)不能根据输入的...
分类:
编程语言 时间:
2015-03-29 09:25:17
阅读次数:
194
拓扑排序拓扑排序主要有无前驱,无后继和dfs三种方法; 若只需判断是否为拓扑序列(DAG),可用上述拓扑排序看是否排序成功,也可用floyd传递闭包;无前驱的拓扑排序法:/* 无前驱的拓扑排序法 */bool toposort(){ queue q; while(!ans.empty()...
分类:
编程语言 时间:
2015-03-11 16:59:08
阅读次数:
244
题目:确定比赛名次Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 337 Accepted Submission(s): 180 Problem Description有N个比赛队(1 Input输入有若干组,每组中的第一行为二个数N(1 Out...
分类:
其他好文 时间:
2015-03-08 20:15:40
阅读次数:
152
题解:
我们构建一颗灾难树,使得一个节点的任意一个祖先灭绝,则其会灭绝。
则可以按照拓扑序扫每个节点,然后加入到灾难树中时只需要把它的父亲赋成它所有食物的LCA就好了。
我们可以动态处理每个节点的倍增lca数组fi,jf_{i,j}表示i的第(1j)(1高祖先。
代码:
#include
#include
#include
#include
#include
#defi...
分类:
其他好文 时间:
2015-03-06 20:48:12
阅读次数:
185