图论杂题

\(Redundant\ Paths\ G\)

[P2860 USACO06JAN] Redundant Paths G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

给定一张\(n\)个点\(m\)条边的连通无向图,求最少加多少条无向边,才能变成边双连通图。

先求原图的边双,将一个边双看作一个点,那么在新图中,每个点都是边双,边都是割边。我们发现不连通的情况是只连有一条边的点,即叶节点,所以只要加边将叶节点连起来就行,记录叶节点个数为\(cnt\),那么答案就是\(\frac{cnt}2+1\)

\(We\ need\ more\ Bosses\)

We Need More Bosses - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

给定无向图,找到两个点\(s,t\),使得 \(s\)\(t\)必须经过的边最多,无论\(s,f\)哪条路径都要经过的边就是必须经过的边。

必须经过的路径其实就是割边,\(s,t\)分属两个边双,则必须经过这个割边。而如果\(s,t\)属于一个边双,则没有必须经过的边。

所以我们将边双看作一个点,建新图,新图显然是一棵树,求最多的必须经过的边就变成了求树的直径。

(70待调)\(SDOI\)战略游戏

[P4606 SDOI2018] 战略游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题意:

这款战略游戏的地图由 \(n\) 个城市以及 \(m\) 条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着道路走到任意其他城市。

现在小 C 已经占领了其中至少两个城市,小 Q 可以摧毁一个小 C 没占领的城市,同时摧毁所有连接这个城市的道路。只要在摧毁这个城市之后能够找到某两个小 C 占领的城市 \(u\)\(v\),使得从 \(u\) 出发沿着道路无论如何都不能走到 \(v\),那么小 Q 就能赢下这一局游戏。

小 Q 和小 C 一共进行了 \(q\) 局游戏,每一局游戏会给出小 C 占领的城市集合 \(S\),你需要帮小 Q 数出有多少个城市在他摧毁之后能够让他赢下这一局游戏。

题解:

能使得\(u,v\)不相连的点一定是割点,所以求出\(S\)集合内两两点路径上的割点即可。对应到圆方树上,就是求路径中非叶子节点的圆点的数量。但是这样做时间复杂度爆炸,我们考虑等价结论。

发现等价结论为:求一个能覆盖\(S\)的最小连通块\(G'\),答案为\(G‘\)中圆点的数量减去\(S\)。因为最小连通块保证了叶子节点的圆点一定是\(S\)中的点,其他圆点一定都是非叶子节点。

那么现在问题就转化为怎么求这个树上最小连通块\(G'\)

我们考虑将\(S\)\(dfs\)序排序,\(S_1,S_2,...,S_n\),对于第一次\(path(S_1,S_2)\),到下一次\(S_i,S_{i+1}\),路径都是先从\(S_i\)\(lca(S_i,S_{i+1})\)向上一次的路径回溯一部分,再从\(lca\)\(S_{i+1}\)。这样到最后只剩下的路径可以由\(path(S_1,S_n)\)包含。其实就是先向下\(dfs\)一次,再回溯一次。所以连通块的大小就是\(|G'|=\frac{dis(S_1,S_2)+dis(S_2,S_3)+...+dis(S_{n-1},S_n)+dis(S_n,S_1)}{2}\)

对于圆方树,我们就设圆点权值为\(1\),方点为\(0\)

最后可导致\(S\)中不连通的城市数量就是\(|G'|-|S|\)

\(Cow\ Contest\ S\)

[P2419 USACO08JAN] Cow Contest S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

奶牛之间的比赛结果就反映二者之前的强弱排名,我们有若干强弱先后关系,要给它们排序,在一般图中就是传递闭包用来给多个东西排序。一头奶牛的名次确定,当且仅当它与其它\(n-1\)头奶牛都有强弱关系,那么我们记\(f[u][v]\)表示\(u\)胜过\(v\)\(f[v][u]\)表示\(v\)胜过\(u\),只要做传递闭包得到任意奶牛之间的强弱关系就行,时间复杂度\(O(n^3)\)

(待写)\(CF998div3\ Graph\ Composition\)

Problem - E - Codeforces

题意:

给定两张图\(F,G\),对于\(F\)可以进行两种操作,删除\(u,v\)之间的一条边,给\(u,v\)加一条边。进行若干次操作使得\(F\)的点之间的连通性与\(G\)的连通性相同,求最小操作次数。

题解:

我们先求出\(G\)的连通性,分成若干连通分量。然后求\(F\)的连通性,如果\(F\)中两点所处同一连通块而\(G\)中并不连通,删掉这条边,删边的操作数\(+1\)

此时\(F\)中不存在多余的边,而\(G\)中没有。

此时情况是\(F\)可能不存在\(G\)中有的边,然后求出\(F\)的连通块的数量,添加的边数就是\(F\)\(G\)的连通块的数量差。

\(Bear\ and\ Friendship\ Condition\)

Bear and Friendship Condition - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题意:

给定一张\(n\)\(m\)条边的图,要求\(A,B\)有边,\(B,C\)有边,则\(A,C\)也要有边,问给定的图是否满足条件。

题解:

条件等价于每个连通块都是一张完全图,那么知道完全图的边数是\(tot(tot-1)/2\)。那么我们就可以用边数来判断是否成立,并查集求连通块及其大小,做法需要无重边,可以去重边或题面保证无重边。

\(K\)度图

题意:

给定一张图,求原图的一个最大子图,使得子图中每个点的连边数都不少于\(k\)

题解:

考虑拓扑排序的思路,首先我们假设这个最大子图就是原图,因为每个点的度数要不少于\(k\),所以我们要删掉度数小于\(k\)的点,同时其他点的度数也会减一,按照这个顺序下去,直到剩余的所有点的度数都不小于\(k\),此时就是最大子图。这跟拓扑排序类似,只不过度数的要求改变了。

\(Labyrinth\)

Labyrinth - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题意:

\(n\)\(m\)列的迷宫,有空地和障碍,起点在\((r,c)\),上下移动次数无限制,向左移动最多\(x\)次,向右移动最多\(y\)次,求从起点出发最多到达多少个格子(包括起点)。

题解:

设当前在\((x,y)\),起点在\((r,c)\),向左走的步数为\(a\),向右走的步数为\(b\),步数的差值固定\(a-b=c-y\),所以我们可以最小化向左的步数,保证此时向右的步数也是最少的。能否到达该格子,就相当于从起点到该处的向左向右步数都少于限制,设向左的花费为\(1\),求最短路即可,边权为\(0,1\),所以双端队列\(01bfs\)

CF869D

求完全二叉树的子树的siz

\(NOIP2013\)货车运输

[P1967 NOIP 2013 提高组] 货车运输 - 洛谷 (luogu.com.cn)

题意:

\(n\)座城市,\(m\)条双向道路,每条道路有重量限制,有\(q\)辆货车从\(x\)\(y\),询问是否能到达,若能到达则最大载重是多少。

题解:

在一张图中为了载重最大,会有许多道路是不会被经过的,这启发我们求一棵最大生成树。然后对于\(x\)\(y\)路径的最大载重,可以在\(lca\)的过程中倍增维护。

另一种做法是\(Kruskal\)重构树,题目本质就是求图上两点路径的最小权值的最大值,求出最大生成树的重构树,则\(x,y\)的最大载重就是\(x,y\)\(lca\)的点权。

\(CF1706E\ Qpwoeirut\ and\ Vertices\)

CF1706E Qpwoeirut and Vertices - 洛谷 (luogu.com.cn)

题意:

给出\(n\)个点,\(m\)条边的不带权连通无向图,\(q\)次询问至少要加完编号前多少的边,才能使得\([l,r]\)中的所有点两两连通。

题解:

我们给边赋予一个边权,大小是边的编号。加完某个编号前的所以的边使得\(x,y\)连通,这个答案就是原图\(x,y\)路径上权值的最小值。这就是在求路径上最大权值的最小值,发现这个求最小生成树的\(Kruskal\)重构树即可,答案就是\(w(lca_{x,y})\)。那对于区间\([l,r]\)就是区间\([l,r]\)\(lca\)的点权。

然后问题转化为如何求出区间\(lca\)。我们发现区间\(lca\)就等价于区间内\(dfs\)序最小的点和\(dfs\)序最大的点的\(lca\)。维护区间\(min(max)dfs\)序即可,\(ST\)表或线段树。

\(NOI2018\)归程

[P4768 NOI2018] 归程 - 洛谷 (luogu.com.cn)

题意:

\(n\)个点\(m\)条边的无向连通图,每条边有长度和海拔两个权值。\(t\)组数据,终点在\(1\)号点,\(q\)次询问,每次给出当前起点\(v\)和当前水位线\(p\)。海拔高于水位线的道路可以无代价通过,否则代价为道路长度,最小化代价。

题解:

水位线相当于限制了边权,海拔高于\(p\)的可无代价通过。发现每次路径肯定都是先坐车到一个地方,然后再走它的最短路到\(1\)。我们可以按海拔排序,建最大生成树的\(Kruskal\)重构树,新点的权值是道路的海拔,这样是一个小根堆,\(p\)水位线相当于在树上画了一条水平线,在线下的点都可以无花费连通,我们只要求这棵子树中的最小答案即可。\(dij\)预处理每个点到\(1\)的最短路,然后做树形\(dp\)计算每个子树的最小值。对于每次起点\(v\),倍增找到它能无花费到达的最浅的点,答案就是这棵子树的\(dp\)值。多测注意清空。

倍杀测量者

题意:

当一位选手 A 的分数不小于选手 B 的分数 \(k\)\(k>0\))倍时,我们称选手 A \(k\) 倍杀 了选手 B,选手 B 选手 A \(k\) 倍杀 了。

更奇妙也更激动人心的是,训练前有不少选手立下了诸如 “我没 \(k\) 倍杀选手 X,我就女装”,“选手 Y 把我 \(k\) 倍杀,我就女装” 的 Flag。

知道真相的良心教练 Patchouli 为了维持机房秩序,放宽了选手们的 Flag 限制。Patchouli 设定了一个 常数 \(T\),立下 “我没 \(k\) 倍杀选手 X 就女装” 的选手只要成功 \(k - T\) 倍杀了选手 X,就不需要女装。同样的,立下 “选手 Y 把我 \(k\) 倍杀我就女装” 的选手只要没有成功被选手 Y \(k+T\) 倍杀,也不需要女装。

提前知道了某些选手分数和具体 Flag 的 Scarlet 实在不忍心看到这么一次精彩比赛却没人女装,为了方便和 Patchouli 交易,Scarlet 想要确定最大的实数 \(T\) 使得赛后一定有选手收 Flag 女装。

题解:

首先我们对每个人都不需要女装的限制建图,不等式为\(A\ge (K-T)B,(K+T)A\ge B\)

限制条件考虑差分约束,乘法化为加法不难想到取对数,即化为\(log(A)-log(K-T)\ge log(B),log(A)+log(K+T)\ge log(B)\)

同时我们还知道\(t\)名同学的真实成绩,考虑建立源点\(0\),等于的限制可拆为大于等于并且小于等于。即\(dis(0)+dis(c)\ge x,dis(0)+dis(c)\le x\)

建图后,如果存在负环,就表明无法满足约束条件,肯定有人女装。对于答案\(T\) 显然具有二分性,二分这个值即可。

posted @ 2025-05-22 17:54  青涩的Lemon  阅读(91)  评论(0)    收藏  举报