BZOJ3832: [Poi2014]Rally(拓扑排序 堆)】的更多相关文章

题意 题目链接 Sol 最直观的思路是求出删除每个点后的最长路,我们考虑这玩意儿怎么求 设\(f[i]\)表示以\(i\)结尾的最长路长度,\(g[i]\)表示以\(i\)开始的最长路长度 根据DAG的性质,显然我们删除一个点后,整个集合会被分成两部分:拓扑序小于/大于当前点 那么此时的最长路一定可以通过计算连接着两个集合的边\((u, v)\)的\(f(u) + f(v) +1\)得到 这样的话我们可以直接维护边集,在统计每个点的答案的时候首先删掉入边的贡献统计答案,统计完后再加入出边的贡献…
题目描述 给你一张有向图,问:编号-位置序(即每个编号的位置对应的序列)最小(例如1优先出现在前面,1位置相同的2优先出现在前面,以此类推)的拓扑序是什么? 输入 第一行是一个正整数D,表示数据组数. 接下来是D组数据. 对于每组数据:  第一行两个用空格分开的正整数N和M,分别表示菜肴数目和制作顺序限制的条目数.  接下来M行,每行两个正整数x,y,表示“x号菜肴必须先于y号菜肴制作”的限制.(注意:M条限制中可能存在完全相同的限制)  输出 输出文件仅包含 D 行,每行 N 个整数,表示最优…
题目描述 An annual bicycle rally will soon begin in Byteburg. The bikers of Byteburg are natural long distance cyclists. Local representatives of motorcyclists, long feuding the cyclists, have decided to sabotage the event. There are   intersections in B…
3832: [Poi2014]Rally Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 168  Solved: 84[Submit][Status][Discuss] Description An annual bicycle rally will soon begin in Byteburg. The bikers of Byteburg are natural long distance cyclists…
题面 传送门 思路 首先,一个显然的结论是:Alice调整过后的序列中任意两个不互质的数的相对顺序无法改变 那么我们可以以这个性质为突破口 我们在两个不互质的权值的点之间连一条边(没错这是个图论题!!!),那么每个联通块的一个拓扑序就会是这个块最终被Bob变成的样子 显然,Alice可以贪心操作,使得这个拓扑序中越小的越靠前 那么我们把所有数从小到大排序,然后从小的开始dfs,每次dfs时从最小的开始先走,得到一个$DAG$ 然后把所有的$DAG$的拓扑排序的那个队列插到一个堆里面,每次取出最小…
题目链接 BZOJ3832 题解 神思路orz,根本不会做 设\(f[i]\)为到\(i\)的最长路,\(g[i]\)为\(i\)出发的最长路,二者可以拓扑序后\(dp\)求得 那么一条边\((u,v)\)的对应的最长链就是\(f[u] + 1 + g[v]\) 我们人为加入源汇点\(S\),\(T\),\(S\)向每个点连边,每个点向\(T\)连边 我们考虑把整个图划分开 一开始所有点都在\(T\)这边,割边为所有\(S\)的边 然后我们按照拓扑序把点逐一加入\(S\)集合中 加入时,我们删去…
题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间口味搭配的问题, 某些菜肴必须在另一些菜肴之前制作,具体的,一共有 M 条形如“i 号菜肴‘必须’ 先于 j 号菜肴制作”的限制,我们将这样的限制简写为<i,j>.现在,酒店希望能求 出一个最优的菜肴的制作顺序,使得小 A能尽量先吃到质量高的菜肴:也就是说, (1)在满足所有限制的前提下,1…
传送门-> 这题的原理看上去很神奇. 称拓扑图中入度为0的点为“起点”,出度为0的点为“终点”. 因为“起点”和“终点”可能有很多个,算起来会很麻烦,所以新建“超级起点”S,向所有点连边,“超级终点”T,所有点向它连边.这样原图中的最长路就是新图中的最长路-2. dis[a->b]表示a到b的距离. 对于一个拓扑图而言,它的一个割集中肯定有一条边在最长路上.对于每条边,可以将dis[S->该边起点]和dis[该边终点->T]算出,那么该边所在路径中的最长的一个就是dis[S->…
f[0][i]为i出发的最长路,f[1][i]为到i的最长路 新建源汇S,T,S向每个点连边,每个点向T连边 将所有点划分为两个集合S与T,一开始S中只有S,其它点都在T中 用一棵线段树维护所有连接属于两个集合的点的边,权值为f[1][u]+f[0][v] 按拓扑序依次计算去掉每个点后图中的最长路 对于当前计算的点x,先将所有连向x的边删除,此时最长路长度为线段树中的最大值 然后再将所有x出发的边加入线段树中 时间复杂度$O(m\log n)$ #include<cstdio> #define…
有个容易混的概念就是第一问的答案不是k[i]字典序最小即可,是要求k[i]大的尽量靠后,因为这里前面选的时候是对后面有影响的(比如两条链a->b c->d,ka=4,kb=2,kc=3,kd=4,按字典序就先选c然后b就不能合法了) 所以倒着来,建反图,然后按照n-k[i]从大到小拓扑,因为是反图所以是k大的尽量靠后 然后考虑第二问,是当前点x在拓扑中能入队先不入,直到某个点非法再入,这样虽然顺序变了但是非法点的排名不变所以依然合法 #include<iostream> #incl…