考前口胡题解,回来补全的

P7054:

题意:给出一个 dag,加 \(k\) 条边使得最小的拓扑序最大,给出构造。

做法:

搞笑题,注意到我加的边一定在最终拓扑序上一定是相邻的,那么我只用考虑拓扑序。直接考虑遇到一个点我直接令他作为某一条边的终点,用两个优先队列维护还没确定的点和入度为 \(0\) 的点。然后讨论一下入度为 0 点,如果有多个,那么最小的可以作为某条边终点,并且肯定优;如果边用完了就直接删除;如果只有一个点,那么我考虑还没确定的那些点里面最大的,如果大于目前这个点,那么我不妨让大于的这个点作为拓扑序的下一位,同时我把当前点扔进终点集合,加一条边即可。复杂度一只 log。这个题啥时候降蓝或者紫啊。

P12077:

题意:给出一个图,问最多能令多少条边无向使得通过我给出的原始图的强连通分量状态,推出这些无向边的的方向,并给出有多少种方案。接受 \(O(m^2)\) 复杂度。

做法:

牛牛题。不知道是不是因为自己三个月前和同学看过这个题一眼胡出结论了。

首先一条边如果自己反向正向不影响强连通性那么删不了,不在强连通分量里的就可以直接算掉。

然后考虑强连通分量里的,我考虑把这条边删掉之后原本的强连通分量会裂开变成一个多个强连通所构成的 dag 状物。发现删两条边所构成的连通分量集合如果不同,那么他们之间是不相关的,证明先咕咕咕。所以我可以直接枚举每条边删掉然后去跑出来连通性。然后考虑每个等价类里,如果我出现了一个环,那么我必须要留一条边定向,否则我就可以靠别的等价类来定向,这样就可以全删,直接算就可以。枚举每条边删除跑 tarjan,复杂度 \(O(m^2)\)

P9257:

题意:建议去看原题面,大概口述一下,有点绕。有 \(n\) 个人 \(m\) 条咒语,每条咒语只有两个人不知道并且会告诉你,每个人都知道自己知道的咒语谁不知道,如果有人知道自己有不知道的咒语,那么他就会离开。现在告诉他们场上有咒语,问前 \(k\) 天内第一天有人走的是哪一天,哪些人会走。\(n,m\le 3000,k\le 30\)

牛牛题,建议先自己手玩一下看看情况,当然我的猪脑有点超载玩到第三天就有点玩不明白了。首先第一天不知道咒语的人会走。第二天如果一个人走,说明在他知道的咒语里,有人不知道任何一条,但是他没走,说明他掌握一条我不知道的,所以我会走。第三天如果一个人走,那么说明在他知道的咒语里,应该存在两个人知道的咒语不交,但是他们两个都没走,说明我有不知道的。依次类推。

总结一下,如果一个人第 \(x\) 天走,那么就等于在他的视野里,能找到 \(x-1\) 个人,\(\bigcap\limits_{i=1}^{x-1} S_i = \varnothing\)。换成补集,也就是不知道的,等于全集。发现我如果对不知道一条咒语的两个人连边,就等于我要找一个最小点覆盖。

最小点覆盖是 npc,直接做完全做不了,但是注意到 \(k\le 30\),也就是说我的点覆盖大小不能超过 30,否则直接输出 -1。我们考虑朴素的爆搜,但是我们注意到一个优化:如果一个点不选,那么他的邻点都要选,所以我们可以取度数比较大的点来优先枚举。如果目前点的度数都 \(\le 2\),那么显然是环 + 链的情况,可以直接计算;否则我们直接枚举度数最大的点选或不选。复杂度是 \(T(k) = T(k-1)+T(k-3)\) 还要乘上一个 \(n\) 的计算时间,发现 \(T(30)\) 并不大,所以是能过的。

posted @ 2025-11-28 11:46  LUlululu1616  阅读(11)  评论(0)    收藏  举报