是。
不知道为啥这题想写详细点。
题意简述
有一个 \(n\) 个点的简单图,你需要动态加入 \(m\) 条边并在每一次加边后回答选边使得每个点的度数都为奇数时,最大边权的最小值,若无解输出 -1。
\(2\le n\le 10^5\),\(1\le m\le 3\times 10^5\)。
题解
限制过于神秘时要么是网络流一派的诡异建模,要么就是可以利用性质转换问题🤔。
这个题显然符合限制过于神秘这个特点,但是这直觉上和图论建模没啥关系,至少选边集这种东西我能想到图论建模只有拆成选和不选两种情况然后最小割,但这既不是一个完整的思路也不是一个正确的复杂度。
所以我们需要推性质,对于这一步有一个通用做法是:发现充分/必要->猜测是否充要->证明。
我做的时候首先发现了如果选的边集中有环,那么可以把环整个去掉,环上的每个节点度数减 2,也就是说肯定有一种最优方案是森林,这个东西虽然必要,但是我奶奶都能发现这不充分。
画了几个合法的树后,又发现节点数始终为偶数——这也不难理解,奇数个点每个点的度数也都是奇数,你用【数据删除】想也知道这不可能,于是我们又有了一个必要条件🤩。
那么偶数个点的树是一个充分条件吗,很遗憾不是,但手膜时我发现这种情况下似乎总能通过选出一些边来满足限制,那树都可行了拓展到连通块肯定还是可以的,关键是证明。
证明:
考虑对于一条边连接节点 \(u,v\),其中 \(u\) 度数为偶数。
- 若删掉这条边后 \(u,v\) 的连通块大小都为偶数,可以直接删掉。
- 否则删掉边后的 \(u\) 的连通块大小为奇数,度数为奇数,那么 \(u\) 连出去的连通块大小就是偶数,因为奇数个奇数相加结果为奇数,所以 \(u\) 连出去的连通块中必定至少有一个大小为偶数,可以将这种连通块割掉。
因为我们是对于连通块的讨论,所以如果有偶度点这种边就必定存在,于是我们可以不断割成仍然为偶数大小的小连通块直到所有的点都是奇度。
整理一下我们目前有的结论:
- 有解当且仅当所有连通块都是偶数大小
- 一定有一种最优解是选出一个森林。
维护连通块都是偶数大小应该容易多了,但是你说的对,但是原问题是一个最优解问题,您证明的螺旋帅气结论一个是可行性,一个是构造的方案😩。
但是这不意味这结论用不上了,把最优解转换成可行性容易想到二分,然后啊,然后我就不会做了😅,翻题解区有整体二分做法不知道是不是这个。
但是你灵机一动!加边操作永远不会增加奇数联通块的个数🥰,那么我们类似双指针地,时间轴从后往前,将边按权值排序后对于每一个位置不断加边直到所有连通块都是偶数大小,答案就是加的权值最大的边。
但是有些边会消失啊怎么办,诶这好像是线段树分治板子来着。
做完了,嗯。