图论小技巧以及一些良心的题目

MST相关

先说几个这类题的套路:

1、砍掉无意义的边。

2、改变边的联通方式。

3、lct大法好啊!

再说几个MST的性质:

1、一张图的所有MST拥有完全相同的边权集合。

2、对于不同的MST,在加入所有

3、只有权值相同的边才会互相影响。

然后就是题目啦。

AT2134
这个题要用到第二个套路即第二个性质。

显然,我们可以将 a + 1 a+1 a+1 b b b连的边改为向 a a a连,而 b + 1 b+1 b+1改为向 b b b连。然后重复这个过程,最终 a + i a+i a+i会向 a + i + 1 a+i+1 a+i+1连一条权值为 c + 2 i + 1 c+2i+1 c+2i+1的边, b + i b+i b+i会向 b + i + 1 b+i+1 b+i+1连一条权值为 c + 2 i + 2 c+2i+2 c+2i+2的边,这样我们可以对 a a a b b b各打一个标记,最后用对于每个 i i i,用 f [ i − 1 ] + 2 f[i-1]+2 f[i1]+2来更新 f [ i ] f[i] f[i]即可。当然由于是环,所以我们要先找出最小值(永远不可能被更新)再更新一圈即可。别忘了 a a a b b b还有一条 c c c的边,总加入边数为 n + q n+q n+q

CF891C
由于有第三个性质,所以我们可以把询问按照权值分开。考虑 k r u s k a l kruskal kruskal的加边过程:由于权值小于 x x x的MST上的边已经全部加入并查集,那么我们只需要将这些边再加进去,然后判一下是否合法即可。

接下来就是怎么处理“权值小于 x x x的MST上的边已经全部加入并查集”这个问题。一个常见的思路是,我们可以用一个可持久化并查集,对所有 x x x去维护上面那个东西。但这么做不够优美,所以我们想到另一个更加优秀的思路:对每条边,维护这样一个信息:在加入所有权值小于它的边后,它的两端分别属于哪两个连通块。

AT3611 Tree MST
这题真是个好题诶。

如果你能看到距离而想到点分治,那么你就离成功不远了。考虑点分治之后,我们需要做的是想办法将这么一堆子树合并起来,因为递归下去之后就没机会再合并了。那么问题来了,怎么合并呢?

很简单——找出 d i s x + v a l x dis_x+val_x disx+valx最小的点,然后把当前点分治的这一层中的其它所有点向这个点连边并加入候选名单。

这样为什么是对的呢?

考虑一个不在 x x x所在子树的点 y y y,根据题目给出的新边权定义,当这个点其它子树连边时,必然要经过树根,由于 v a l y val_y valy可视作常量,那么它去连 d i s x + v a l x dis_x+val_x disx+valx最小的点一定是最优的。至于在 x x x所在子树内的点,我们管不管它都无所谓,因为它目前和 x x x是同一个子树的(不要忘了我们只需要将这次点分治的一堆子树合并起来就可以了),并且它会在更深层的点分治中与 x x x相连。

Tarjan相关

P5234 [JSOI2012]越狱老虎桥
超级大水题……
要删掉一条边使图不连通,那这条边必然是桥。所以考虑对边双缩点,之后就是树上的问题了。

首先,加边的一方肯定是贪心的让最小的几条边都不再是桥,但由于只能加一条边,所以他只能覆盖一条链。这条链要尽可能的包含更多的最小边,所以我们考虑对边排序后一条一条加入树中,直到某一次加边无法被之前的链包含为止。至于如何维护这条链,自己好好想想然后大模拟即可……

你可能感兴趣的:(图论)