果然练了两个多月图论还是那么菜啊。
$A$
给你一个 $n$ 节点 $m$ 条边的无向图,无向图中可能存在“环”(回路)。
编号到的这个点,被称为关键点。何老板要你删掉一些边,使得所有 $k$ 个关键点都不在环上。关键点编号 $1\sim k$。
问,最少需要删多少条边?$\texttt{Data Range:}1\le k\le n\le 10^6,1\le m\le 2\times 10^6$
并查集判环,先扫一遍,只考虑两个端点都大于 $k$ 的边,维护并查集。
再扫一遍,剩下的至少有一个端点 $\le k$ 的边如果加进去发现有环,那么删除这条边一定是最优的。这个地方不好证明导致考试的时候没人敢写。
不会证明就考虑 hack 这个做法。hack 的想法肯定是删除一条边同时破坏两个环。
似乎可以构造这样的 hack 数据:
1 | 6 7 2 |
构造这个数据的本意是删除 $5\leftrightarrow 6$ 的这条边破坏两个环 $1\leftrightarrow 2\leftrightarrow 5\leftrightarrow 6$ 和 $3\leftrightarrow 4\leftrightarrow 5\leftrightarrow 6$。所以这样真的 hack 了吗?
我们发现即使删了这条边还是有 $1\leftrightarrow 2\leftrightarrow 5\leftrightarrow 3\leftrightarrow 4\leftrightarrow 6$ 这个更大的环……
如果删了一条边同时破环两个环,那么意味着这条边同时在两个环上,也就是说这两个环有两个点是相同的。
有两个点相同?那这两个环不就可以形成一个更大的环了!并且这个环还不依赖这条边。
所以我们感性理解一下终于敢写代码了(
1 |
|
$B$
给你一颗 $n$ 个节点的无根树,找出 $k$ 条路径覆盖尽量多的节点。
$\texttt{Data Range:} 1\le n\le 10^6$
有一个显而易见的贪心,每条路径起始端点一定是叶子节点。类似拓扑排序的过程,先将所有叶子入队,然后将队首元素删除,将新的没有儿子的节点入队。设拓扑序第 $i$ 层的节点有 $a_i$ 个,则答案就是 $\sum\limits^{i\le n}_{i=1}\min(2\times k,a_i)$。
证明不会,只会感性理解(((
1 |
|
$C$
魔杖护法Freda融合了四件武器,于是魔杖顶端缓缓地生出了一棵四叶草,四片叶子幻发着淡淡的七色光。圣剑护法rainbow取出了一个圆盘,圆盘上镶嵌着 $n$ 颗宝石,编号为 $0\sim n-1$。第 $i$ 颗宝石的能量是 $a_i$。如果 $a_i>0$,表示这颗宝石能量过高,需要把 $a_i$ 的能量传给其它宝石;如果 $a_i$,表示这颗宝石的能量过低,需要从其它宝石处获取 $-a_i$ 的能量。保证 $\sum a_i=0$。只有当所有宝石的能量均相同时,把四叶草魔杖插入圆盘中央,才能开启超自然之界的通道。
不过,只有M对宝石之间可以互相传递能量,其中第i对宝石之间无论传递多少能量,都要花费Ti的代价。探险队员们想知道,最少需要花费多少代价才能使所有宝石的能量都相同?$\texttt{Data Range:}1\le n\le 16$
状压 dp 套个 MST。
$dp_s$ 表示将 $s$ 集合中所有宝石能量变为 $0$ 的最小花费。显然有 $dp_s=\min(dp_{s0}+dp_{s\setminus s0})$。再对 $s$ 集合单独跑一遍 MST。
看到这种数据范围和集合还有 MST 就想成了才学的斯坦纳树,令人谔谔的是斯坦纳被卡了,考完后狂笑不止,肥肠开心。
1 |
|
$D$
何老板有 $n$ 个俄罗斯套娃,编号 $1\sim n$。
每个套娃从外部看,都有一定的体积,$i$ 号套娃的外部体积为 $A_i$
每个套娃内部是空的,有一定的容积,$i$ 号套娃的内部容积为 $B_i$对于两个套娃,若 $A_i\le B_j$ 那么 $i$ 号套娃可以套在 $j$ 号套娃内。此时,$j$ 号套娃剩余的内部体积为 $B_j-A_i$。
何老板套了一些套娃,设这些套娃从内到外编号为 $i_1,i_2…i_k$,则剩余体积为 $B_{i_1}+(B_{i_2}-A_{i_1})+…+(B_{i_k}-A_{i_{k-1}})$
何老板想选若干套娃套起来,使得剩余的体积要最小,且剩余的其他套娃无法再从最外面套上去或套进最内部。设该最小剩余体积为 $MinV$。
问,使得剩余体积为 $MinV$ 的不同方案有多少种?请你帮他计算。 $\mod 10^9+7$后再输出。$\texttt{Data Range:}1\le n\le 2\times 10^5$
神奇图论题。
如果套娃 $i$ 能套下套娃 $j$,从 $i$ 向 $j$ 连一条边权为 $B_i-A_j$ 的边。
如果套娃 $i$ 不能被任何套娃套下,从超级源 $s$ 向 $i$ 连一条边权为 $0$ 的边。
如果套娃 $i$ 谁也套不进去,从 $i$ 向超级汇 $t$ 连一条边权为 $B_i$ 的边。
求一个最短路方案数即可。由于图是 DAG 可以跑记搜。
但是暴力连边边数是 $n^2$ 级别的,无法承受。考虑线段树优化建图,为了不写恶心的权值线段树和离散化,把所有套娃按 $A_i$ 从小到大排序。
从左往右扫,对于第 $i$ 个套娃,二分出左边最后一个 $A_j\le B_i$ 的 $j$,则问题变成了 $i\rightarrow [1,j-1]$ 连边。线段树优化建图就行了。
还有 dp 做法,但其实就是把图论的 $dis$ 数组换成 $dp$ 数组,常数会小亿些,本质是一样的,就不讲了(
1 |
|