【Comet OJ - Contest #15 G 孤独的吉姆 6】【图论】

题意

给一个 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 n6105,m9105

分析

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值