图论杂题选讲

sdfz Qyc/Hotan No.84 High School Chen Yuqiu/ShanLunjiaJian

今天切什么

不知道。继续看就知道了!那么这一页为什么存在呢?

放了20个比较简洁的题,希望可以让大家有事干。技术水平要求不是很高,应该可以随时断线重连吧(

CF1301F Spuer Jaber

$n\times m$的棋盘,每个点有一个颜色,颜色一共有$k$种,你每一步可以走到四连通的点,或者传送到和当前点颜色相同的任意一个点,多次查询两个点之间的最短路。$n,m\leq 1000,k\leq 40,q\leq 10^5$。

hint

这是一个简单题。

solution

如果没有用传送,可以直接算。如果用了,那么枚举第一次和最后一次分别在哪个颜色传送,问题变成两个颜色之间的最短路。那么求出两个颜色之间的距离,然后对所有颜色跑一个floyd即可,求这个距离可以跑$k$次多源bfs。复杂度$O(nmk+qk^2)$。然而$qk^2$有点大。

考虑直接求出一个颜色到一个格子的距离。也就是说我们转移的时候需要考虑传送,发现一个颜色的传送只会在第一次遇到这个颜色的时候用到,所以每次bfs还是$O(nm)$的。总复杂度$O((nm+q)k)$。

poi 2003~2004 Bramki

有向图,每个点点权可能是$0,1,\frac{1}{2}$,点从$0$开始标号,$0,1$没有入边,权值总分别是$0,1$。一个点的点权合法,当且仅当它的点权是它连向的点的点权中,去掉$\frac{1}{2}$后的中位数(如果$0,1$数量相同,则点权应是$\frac{1}{2}$)。求对于所有合法的点权分配,每个点的点权是不是唯一的,如果是的话,唯一的点权是哪一种。$n,m\leq 10^5$。

hint

考虑求每个点点权的最小值和最大值。

solution

考虑求出最小和最大的可能点权,我们全赋成$1$调整一遍,全赋成$0$调整一遍,如果一个点在两遍中结果相同,那么它是确定的,否则它是不确定的。调整 具体一点就是每次找到一个点,它的点权是不对的,然后把受它影响的点也扔进去。每次修改点权必然是改小/改大,所以复杂度是线性。

xix open cup, gp of siberia B. Birthday

无向图,把点集划分成$k$部分然后拼成一个序列,要求只有相邻两部分或者一部分内部有边。$n\leq 1000,m\leq \frac{n(n-1)}{2}$。

hint

考虑bfs。

solution

注意到bfs树满足这个,并且归纳一下可以发现,如果我们已经选了前$k$部分,那么$k+1$部分必须包含所有和$k$部分有边而不在前面的点,所以它必然是从第$1$部分出发的bfs树按深度划分得到的。注意到bfs树高度$\geq k$则找到了解,所以问题是找到深度最大的bfs树,那么我们必然不会选择多个起点。从每个点出发bfs,用bitset优化可以做到$O(\frac{n^3}{w})$。

ptzsc16 D6 C. Counter-manifestation

有向图,求所有环的交。

hint

先找到一个环,因为环的性质比图好。

solution

把环上的点编号为$1,...,c$。考虑两个点$i,j$,如果环外存在$i\rightsquigarrow j$,那么环上$i\rightsquigarrow j$的部分就被ban了。如果环外存在$j\rightsquigarrow i$,那么环上$j\rightsquigarrow i$的部分就被ban了。

令$i< j$,那么我们知道第一种情况中只有最大的$j$有用,第二种情况中只有最小的$j$有用。把环边删掉,前者直接从大到小记搜即可,复杂度显然是线性;后者从小到大搜,搜到一个点再加入它,复杂度也是线性。

ptzsc16 D9 C. Edge Coloring

无向图,每条边有一个目标颜色,一开始每条边都没有颜色。你从任意一个点出发,在奇数步把边染红,偶数步染蓝,如果已经走过则覆盖之前的颜色,求能否达到目标。$n,m\leq 2000$。

hint

比起 覆盖之前的颜色,我们可能更喜欢 不改变之前的颜色,因为这样你可以在已经走过的部分自由移动。

solution

时间倒流。枚举终点出发dfs。注意到如果遇到奇环就必然可以走完了,否则第一次走到一条边的时候是某个颜色,以后走到这条边还是这个颜色,所以只需要检查第一次,直接dfs即可。

hdu多校16 D7 Colosseo

竞赛图,给一个把点集划分成两部分$A,B$的方案,保证两部分的导出子图都是无环的。现在希望把$B$中的点加入$A$,使得$A$仍然是无环的,求最多加入多少个点。$n\leq 1000$。

hint

无环等价于存在一个全序。

solution

考虑把$A,B$分别排序,那么$B$中一个点可以插入到$A$中的最多一个间隔,否则会形成一个环。此时可以知道一个方案合法,当且仅当插进去的$B$中的点位置正确,并且它们是有序的。简单dp即可。

ptzsc16 D6 B. Colourings

无向图,给定两个独立集划分$A,B$,$A$中所有独立集是非平凡的(大小$>1$),而$B$中的独立集个数设为$k$。找到一个独立集划分,使得其中所有独立集是非平凡的,并且独立集个数不超过$k$。$n,m\leq 2\times 10^5$。

hint

这是一道签到题。

solution

把每个点画在平面上,横纵坐标分别是在$A,B$中的独立集编号。直接按任意方向扫,如果一行只有一个点,那么我们让它向上和同一列的所有点组成一个独立集,否则让这一行组成一个独立集。容易知道这个构造是可行的。

xix open cup gp of Zhejiang H. Hamilton Path

有向图,求所有哈密顿链,设链上点的序列是$p$,满足对于任意$i< j$,存在边$p_i\rightarrow p_j$当且仅当$i+1=j$。这样的链可能很多,你只需要对每一条输出它的某种字符串哈希的值。$n\leq 5\times 10^5,m\leq 10^6$。

hint

考虑爆力怎么做。考虑枚举一个起点。

solution

注意到如果一个点有两条连向还未走到的点的出边,那么其中一条必然成为前向边($i+1< j$的边),所以必然无解。模拟即可,复杂度$O(nm)$。

为了优化,考虑从每个点出发维护一条链,如果一条链可以唯一地接到另一条链后面,那么就接起来,这样如果存在答案,每条链必然都是答案上的一段。

如果某次尝试接到另一条链的中间,那么设是$u,v$同时尝试连向$w$,可以知道终点要么是$u$要么是$v$(考虑从终点出发倒着扩展),分别模拟即可。

否则最后只剩下一条链,我们就得到了一个解。考虑如果它还能接成一个环,那么可能还有一些解,注意到环外每条边会ban掉一个区间,剩下的部分复制一倍直接算哈希值即可。复杂度$O(n+m)$。

xix open cup gp of Udmurtia D. Road Connectivity

无向图,有一个初始状态,每天等概率随机一条边,把它的存在情况反转,每次给定$l,r$,求在第$l$天到第$r$天中至少一天整个图连通的概率。$n\leq 5,l,r\leq 10^{15}$。

hint

爆力怎么做?

缩减状态数。

solution

爆力就是图有$2^{\frac{n(n-1)}{2}}$种,可以对每种的概率矩阵快速幂。注意到标号是完全无用的,所以考虑所有无标号图,发现只有$34$种不同的图,对它们预处理出转移系数再矩阵快速幂即可。

xix open cup gp of Peterhof D. Machines on the Moon

通信题。有一张公开的图,Alice有一个团,Bob有一个独立集,双方一共可以发送$(\lceil\lg n\rceil+1)^2$个bit,判断团和独立集是否有交。

hint

当然二分。考虑进行$\log$轮,每轮发送一个$n$以内的数,那么发送什么可以排除一半的点。

solution

一个公共点和Alice持有的所有点有边,和Bob持有的所有点没有边。

考虑让Alice找到团中度数最小的点,如果这个度数不超过$\frac{n}{2}$,就可以排除一半的点。如果这个点度数超过了$\frac{n}{2}$,此时由于团中每个点的度数都超过了$\frac{n}{2}$,独立集要想和这个团有交,交点的度数也超过$\frac{n}{2}$,也就是独立集中度数最大的点的度数超过了$\frac{n}{2}$,所以还是可以排除一半的点。

具体一点,每一轮,A发送一个度数不超过$\frac{n}{2}$的点的编号或者$0$,如果B收到$0$则发送一个度数超过$\frac{n}{2}$的点,然后按照上面进行折半。

xix open cup gp of Gomel F. Six Words

无向图,点有点权,边有边权。定义一个图的线图是,每条边建一个点,点权是这条边的边权;如果两条边有公共端点,则在它们对应的点之间连一条边,边权是这个点的点权。求一张图的线图的线图的最小生成树。$n\leq 10^5,m\leq 2\times 10^5$。

hint

考虑线图的线图是啥意思。

solution

线图中的点表示原图中的边,边表示原图的边的相邻关系,所以线图的线图中的点表示原图的一对有公共端点的边,边表示两对包含同一条边,边权是这个同一条边的边权。线图的线图的一条边,也就是原图的包含同一条边的两对有两种情况,也就是所有边都有一个公共端点,或者没有,前者对应于原图的一个点,后者对应于原图的一条边,不妨称为第一/二类边。

kru。发现一个点邻接的最短的第二类边必然比最短的第一类边要长,所以我们会先把第一类连起来。

发现如果一个点度数是$c$,在线图的线图上对应$\binom{c}{2}$个点,把它们包含的两条边的边权排名作为坐标画到平面上会形成一个三角形,然后我们会给一行连行对应的边权,一列连列对应的边权。考虑kru,我们首先会把第一列全连起来,然后会把第二列连起来,并把第二列和第一列之间连起来,依此类推,我们知道贡献的系数是$c-2,c-2,c-3,...,1$这样的。

考虑第二类,把第一类边加完之后,原图每个点对应的线图的线图上的点形成了一个连通块,而块之间只需要加第二类边变成树,块之间的一组第二类边对应原图的一条边,所以直接并查集即可。需要注意原图的一度点不对应线图的线图上的点。

poi 1999~2000 Skiers 加强版

有向平面图,有恰好一个源和一个汇,把它平面嵌入,满足每条边都从上面连向下面,然后按照从左往右的顺序给你所有边。求从源到汇最多能选出多少边不交的路径。$n,m\leq 10^6$。

hint

平面图是重要的。

solution

注意到路径必然可以不互相跨过。

贪心地,每次选择最左的还未选择的边,走出一条路径。

ptzwc22 D3 G. Maximal Subsequence

上个题的trick。序列,求最少删掉多少数才能使得lis长度减少。$n\leq 10^5$。

hint

网络流。

solution

容易想到最小割。具体地,设$f(i)$是$i$结尾的lis长度,那么如果$i< j,a_i< a_j,f(i)+1=f(j)$,则连边$i\rightarrow j$,容量是$\infty$,每个点拆入点和出点,连一条容量是$1$的边,表示删掉这个数。源连到所有$f=1$的点,所有$f=\max f$的点连到汇。

对偶成最大流,问题是选择最多的不交的lis。类似上个题,注意到这些lis不会相互跨过,所以不停贪心选择字典序最小的即可。注意到这一轮不能选的数,之后就都不能选了,所以复杂度$O(n)$。

CF1019C Sergey's problem

有向图,求一个独立集,满足任何一个点可以被集合中的某个点走不超过两步到达(可以走$0$步)。$n,m\leq 10^6$。

hint

考虑无向图怎么做。有向图上出现了什么问题,能不能修一修?

solution

如果是无向图,按任意顺序扫,如果一个点没有被覆盖,那么就选择它,这样甚至每个点都能一步走到。但是在有向图上,我们选择的点有可能连向一个前面选过的点,此时就不是独立集了。

考虑如果选了$u,v$,并且$v\rightarrow u$,那么$u$一步走到的点$v$都能两步走到,所以我们不需要选$u$了。但是如果后面又选了一个$w\rightarrow v$,就出问题了。

注意到只可能是后面的影响前面的,出现这种情况就从后往前连一条边,得到一个外向树森林,然后注意到我们只需要选深度是奇数的那些点(根深度是$1$)。所以我们选完之后倒着扫一遍,把所有被后面覆盖过的点删掉。

sdoi2019 R2D2A 热闹的聚会与尴尬的聚会

无向图,你要选$p,q$,构造一个每个点度数至少是$p$的点集,一个大小是$q$的独立集,要求$(p+1)(q+1)>n$。$n,m\leq 10^6$。

hint

可以求出最大的每个点度数至少是$p$的点集。考虑独立集要怎么得到。

solution

不停删掉度数最小的点,我们可以得到一个最大的度数至少是某个数的点集。

考虑怎么得到一个独立集。我们找到最大的$p$,然后按照删掉的顺序贪心选独立集,那么每个点最多和后面$p$个点有边,也就是说得到的独立集大小至少是$\lceil\frac{n}{p+1}\rceil$,那么就有$(p+1)(q+1)>n$。

poi2003~2004 Turniej

有一些波特要比赛,其中某些波特之间的胜负是确定的,而剩下的都是不确定的。胜负可能成环。比赛过程是,每次选择任意两个还没被淘汰的波特比赛,输掉的淘汰,最后一个波特获胜。求哪些波特有可能获胜。$n,m\leq 10^5$。

hint

考虑能赢的波特内部的结构。

solution

注意到如果有超过一个波特能赢,那么一个波特能赢,当且仅当它可以打败一个能赢的波特,因为它必须打败所有波特,而打败了一个能赢的波特的话,只需要先让这个波特打败别的所有波特即可。所以我们找到一个能赢的波特,然后找到所有可以打败它的波特,就得到了答案。

考虑凑一些限制,如果波特$u$必然不能打败$v$,那么说明$v$必然打败$u$和所有$u$可能可以打败的波特,那么$v$的出度必然严格比$u$大,所以我们知道出度最大的波特必然可能赢。

为了找到所有能赢的波特,我们知道如果不是所有能赢的波特都到某个波特有边,那么这个波特也能赢。一开始把出度最大的波特标记为能赢的,每次取出一个能赢的波特,维护一个还没能赢的波特的列表,找到所有它不必然打败的波特,标记为能赢的。注意到每次一个还没能赢的波特没有被标记为能赢的,都要求新处理的能赢的波特到它有边,所以复杂度是线性。

poi2003~2004 Kaglony

定义一张图是好的,当且仅当它是单点,或者是两张好图放在一起得到的,或者是两张好图放在一起,中间连成完全二分图得到的。给一张图,判定它是不是好图。$n,m\leq 10^5$。

hint

爆力怎么做?

加边,加边,加边,然后,并查集查询。

solution

对于没有加边的情况,我们可以把每个连通块分开。对于加满了的情况,在补图上把每个连通块分开。

但是怎么算补图的连通块啊?我们每次加入一个点,然后枚举它的邻边,如果一个连通块中不是每个点都和它有邻边,那么发生了一次合并,这个可以维护没有边的连通块的列表做到线性。

注意到每两轮必然分别是两种情况,所以边数会减少至少$n$,并且进行$n$轮必然结束,所以轮数是$O(\min(n,\frac{m}{n}))$的,当然一般来说很松。复杂度$O(m\sqrt{m})$。

poi2004~2005 Dziuple

无向图,平面上有两条从x轴出发平行于y轴的射线,上面分别有无穷个点,你要把图上每个点放到射线上一个点,边变成两点间的线段,要求没有两条边相交,求方案数。$n,m\leq 10^6$。

hint

考虑什么图才能这么嵌入。

solution

考虑连通怎么做,注意到如果左部最下面那个点是$u$,那么$u$的邻接点只能有最多一个还有别的出边,否则就会相交。所以图必然是一个毛毛虫,我们把主链两端的叶子数$+1$再乘起来,剩下的叶子可以随便排列,还要考虑翻转链和放在哪一边,再乘一个$4$得到答案。注意单点需要特殊处理。

考虑不连通怎么做,不是单点的连通块之间排一排,单点则可以插在任意位置。

ptzsc16 D9 B. Point Pairs

平面上有$2n+1$个点,如果两个点横坐标或者纵坐标相同则连一条边,求删掉每个点后是否存在完美匹配。$n\leq 10^5$。

hint

tutte定理 : 不在最大匹配中的点数,等于选择若干个点删掉之后,大小为奇数的连通块的数量减去删掉的点数的最大值。

solution

注意到如果一个连通块大小是偶数,则必然存在完美匹配,因为我们删掉任何一个点最多使连通块数增加$1$,删掉$k$个点就得到$k+1$个连通块,所以最大匹配外的点数最多是$1$,所以它必然是$0$。

问题变成求删掉每个点之后大小为奇数的连通块数量。为了获取正确的连通性,只需要给每个点连到上下左右第一个点,然后看起来就跟割点很有关系,发现非割点必然有完美匹配,而割点直接在割点树也就是圆方树上跑一遍就好了。

忘了来源题

dag,边有边权,有恰好一个源一个汇,你的目标是走到汇。一开始你在源,每一步你可以选择随机沿当前点一条边走过去,花费的时间是边权,或者选择瞬间回到源。求最优策略下你到达汇的时间期望,输出实数。$n,m\leq 10^5$。

hint

直接dp。转移有环。

考虑迭代。考虑迭代的替代品。

solution

暴力dp显然。二分答案,然后我们就按照这个答案转移即可。本质上来说,我们考虑迭代,它当然收敛于真正的答案,所以我们二分寻找一个不动点。

ioi2022 千岛

有向图,你走过一条边之后,边的方向会反转。求一个从$1$出发回到$1$,并且最后图和开始相同的方案。$n\leq 10^5,m\leq 2\times 10^5$。

hint

考虑我们想要什么样的形状。

solution

猜测如果可以从起点出发走到两个不交的环,或者有两条路径走到同一个环,就赢了。

不停删掉所有没有出度的点,显然它们不会和答案有关系。然后从$1$出发搜两个环。如果它们有交,那么我们就找到了两条走到其中一个环的路径。

为了证明必要性,注意到每个点都有出度,所以一直走必然可以找到环,而如果$1$可以走到一个出度$\geq 2$的点,就找到了答案,否则显然无解。

Thanks for Listening!

Powered by reveal.js