图论杂题

1. CF1801 C: Music Festival

一句话题意: 把n个序列重排,让左扫max更新次数最大。

题解: 在选取专辑时,不是固定顺序从前到后选取的,而是随意打乱顺序后再计算最长上升序列,所以dp是搞不动的。

看起来不是图论题,但是思考后发现我们可以将上升序列当做只往更大的数走,把可以走到的点将小数向大数连边。

具体的,每个序列内部就是从小到大连边,然后我们再加一个数列,将这个数列上的数连向n个序列的头部,将n个序列的末尾连上这个数列,我们从一个序列走到下一个序列,就以这个数列作为中介。由于连边是从小到大,所以造完的图是个DAG。

分析复杂度: 时间上就是跑个DAG最长路,O(n)。空间上,如果我们多组测试数据都建立一个长度为数字大小的数列,就是n^2空间,但我们发现如果一个点值为k,只会有k和k+1和它有连边关系,我们记录下所有可能出现的数,就是在这个数列上只选这几个数,排序连边。空间复杂度O(3n)。

2. 2022昆明ICPC B: Blocks

一句话题意: n张地毯随机选,期望选多少次铺满地面(选过也能选)。

题解: 坐标是1e9,需要离散化下,n是10,适合状压,用2^10=1024个状态表示现在有哪些地毯,我们发现有些状态是铺满的,所以我们算一下到这些状态的期望值。

有两个问题,怎么判断一个状态是否铺满地面?怎么去除重复情况?

对于第一个问题,如果数据量大,我们可以用扫描线算下矩阵的面积并,和地面比较,但是这题离散化后边长最大是20,可以用20*20的二维前缀和判断(常数小,还好写)。

第二个问题,如果我们枚举子集状态来更新,我们发现有些状态已经满足了(铺满就要停止了),我们再计算新状态就重复了。我们冷静思考,发现这个转换关系类似一个图,从子状态向新状态连边,边的意义就是选某个地毯,求从原点走到满足条件的点的期望步数。

这个图就是DAG+自环的一个图,可以通过概率期望公式来求。

复杂度瓶颈在于判断每个状态是否满足题意,实测可过。

3.2021沈阳ICPC H: Line Graph Matching

一句话题意: 原题意很抽象,但是简单转换一下可以改为:一个联通带权无向图,每次选两个相邻的边,tot加上这两个边权并删除,求tot最大值。

题解: 大胆猜结论!当总边数是偶数时,总有一种选边删边方式,可以不重不漏选完所有的边,这个结论很好证明,自行思考。

然后总边数是奇数,就需要舍弃一条边,比如当前图是一个菊花图或一个环,我们可以舍弃任意一条边,舍弃一条边权最小的边就好。

但是对于其它的图,我们舍弃的这条边可以随便选吗?我们冷静思考下我们舍弃的这条边满足的性质。

舍弃的意思是,我们不选择且不删除这条边,相当于忽略,去掉这条边后,图中的边会变成偶数,但是重要的一点:第一条结论需要满足图联通,才能不重不漏。如果舍弃某条边后图不连通,且两个不连通的块边数都是奇数,那就得继续删除了。我们不希望继续删除的话,我们找到所有的可以将图分成两个奇数边图的桥,我们不去删除这些桥。但我们还有一个选择,删除这条桥后继续删除。

我们再猜个结论:最多删一条就够了,继续删肯定不优。也好证:如果我们删的最后一条是为了让最后剩余的那个连通图分成两个偶数边图(为了满足题意的目标),那其实我们全局只删这一条就好了,也能满足题意,前面删的边白删了。

所以一句话题解:边数m为偶数时,答案是总和,m为奇数时,删一条满足条件的边即可,条件是这条边不是分割两个奇数边图的桥。

怎么找这样的桥:缩点后变成一棵树,树边就是桥,节点存内部边数,判断下那些树边满足题意即可。

4.2021沈阳ICPC J: Luggage Lock

一句话题意: 一个四位密码锁,可以拨一位,也可以同时拨相邻的几位,从一个状态到另一个状态最小步数(多测)。

如果我们把1e4个状态连边,发现边数大概1e5级别,能跑一边DIJ,但是这题关键在于多测,就是任意两点间的最短路,我们没有像n2一样优秀的复杂度,甚至n^2都跑不动。

怎么办,一个重要的思想:密码锁的每一位都是独立的。因此,我们不用关系具体状态什么样,只需要关心它怎么走能到目标状态(该怎么拨动)。那我们把初始状态想象成纯0,计算下新的目标状态,其实是等价的,因为密码锁的每一位是独立的。

这样就转换成了单源最短路,即从0000到任意状态的最短路。

代码最复杂的地方在连边,别连错了就行。


不定期更新!qwq ——2023.03.10

posted @ 2023-05-14 17:25  maple276  阅读(19)  评论(0编辑  收藏  举报