题意
给一个 n n n个点 m m m条边的简单无向连通图,要删掉一些边,使得度数为奇数的点尽可能多。输出长度为 m m m的 01 01 01串, 0 0 0表示删掉第 i i i条边, 1 1 1表示不删,要求输出字典序最大的方案。
n ≤ 6 ∗ 1 0 5 , m ≤ 9 ∗ 1 0 5 n\le6*10^5,m\le9*10^5 n≤6∗105,m≤9∗105
分析
比赛结束后几分钟调过了这题,错失了AK的大好机会。
对于两个能够互相到达的点,我们可以通过对两点间某条路径上边的状态取反,来改变这两个点的奇偶性,所以最后要么所有点的度数都是奇数,要么只有一个点的度数是偶数。问题在于如何最大化答案字典序。
如果我们按边的编号求最大生成树,每次随便选两个度数为偶数的点,并改变它们树上路径中边的状态,就能保证编号较小的边在答案中的状态必然是 1 1 1。
可以发现在树的形态固定的条件下,无论按何种方式配对,最终的结果都是一样的。
这时如果所有点的度数都是奇数,那么只需要求出所有边的最终状态就做完了。
如果有一个点的度数是偶数,则还能改变从这个点开始到任意一个点路径上边的状态。这里我的做法是以该点为根dfs求出每条边到根路径上第一个编号小于它的边并在两者间连边,从而得到一棵新的树,然后在新的树上贪心。
时间复杂度 O ( n + m )