一些比较神奇的思路

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hanyuweining/article/details/82838601

emm不定期更新...看心情系列...

First Update(2018/9/25)

这两天连做到两道逆向思维的题,大体写一下(?)

SCOI修车。

很久之前就听说过的一个题,用的一个很神奇的想法。我们不好统计到底这个车是第几个,那么我们就确定他是倒数第几个,这样的话方便统计答案。所以我们把他是倒数第几个全部建出来,费用全部算出来,因为最小费用,它自然而然会流当前可以流的最小的,也就是倒数最近的。然后通过源汇限流就可以了。真的很神奇的建模,建完了看很清晰,但是真的想不到hhh

AGC016E Poor Turkeys

也是一个很神的逆向思维,我们将u,v分类,如果我们要求u这一轮活着,那么v必定死,且它在之前的所有轮里都活着。并且存活集合不能相交,相交的话代表它相对的死了两次。然后我们倒着枚举关系,然后处理就好了。

Second Update(2018/9/26)

感觉生成树这一块做了挺多题,mark一下(?)

BZOJ2521 SHOI2010 最小生成树

当时脑洞一开想到的思路。主要是毕姥爷的课上讲过类似的想法(?)

分析题目就是这条边不变其它边-1相当于这条边+1其它边不变。其实这个是用到的生成树中边的关系是相对的(瞎bb的一句话?)然后我们要求Lab这条边一定存在于最小生成树中,那么其它小于等于它的边要增加。我们自然而然想到了最小割,就是对于每一条小于等于Lab的边,建立流量为V_{Lab}-V_i+1的边(使它超过Lab也就是在kruskal的时候Lab的优先级更高,更先选到),然后以Lab连接的两个点为源汇,最小割即可。(这个是因为我们在kruskal的时候要求当前要的边的两端不连通才可以添加,是一个道理)

诶我突然有个奇怪的想法。我们要让这条边有机会出现在最小生成树中怎么做呢(?)哦好像很蠢的样子emm...留给你自行思考吧...

跟这个题类似的还有一个就是一个图中有黑边和白边,我们希望找到一个生成树中有K条白边,且费用最小,怎么做呢(?)

其实是同理的,我们二分一下给白边的加权,然后跑kruskal就可以了。诶我竟然找到这个题了——BZOJ2654马上去补坑QwQ

次小生成树

非严格维护最大值,严格维护最大值和次大值即可。

洛咕1195 口袋的天空

去年这个时候做的一道题吧,就是给你一个图,让你连边构成K个联通块的最小花费。

直接kruskal并查集维护联通数就行了。好蠢啊hhh

USACO 打水井

有n个地方要打水井,自己挖一个井有Ai的花费,从别的地方引水有Bi,j的花费。一个地方从别的地方引水的前提是那个地方有水井or从有水井的地方引水。(说白了就是有水井的地方可以向别的地方引水,一个地方只要是有水了就可以给别人引水)

加一个原点和每个点连Ai的边,然后跑最小生成树就行了QwQ

BZOJ1016 JSOI2008 最小生成树计数

给你一些边,求最小生成树的个数。两个生成树只要有一条边不同即视为不同。相同权值的边最多有10条。模31101(非质数)

这个最直接的想法是矩阵树定理,然而31101是非质数GG

我们又注意到相同权值的边最多只有10条,是不是可以从这里入手呢(?)

又是根据最小生成树的性质,我们每次连完一种权值的边,图的连通性应该是一样的,所以我们先跑出一个最小生成树,然后对于每一种边爆搜一发,求出方案数。乘法原理解决即可QwQ

误入的01分数规划->Desert King poj2728

这个是要求\sum val_i/\sum len_i的最小值,首先是资磁二分的w。我们就转换成了\sum val_i>=\sum len_i*x继续转换成为\sum val_i -\sum len_i*x>=0然后我们可以将边权设为\sum val_i -\sum len_i*x跑最小生成树判正负即可。这个题prim的复杂度是比较资磁的QwQ

由于笔者要去补bzoj2654的坑,所以跑路了 嗒嗒嗒嗒嗒嗒嗒嗒

猜你喜欢

转载自blog.csdn.net/hanyuweining/article/details/82838601