【每日一题】4月23日题目精讲 dfs+思维
题号 NC17067
名称 边的染色
来源 美团2018年CodeM大赛-复赛
戳我进入往期每日一题汇总贴~
往期每日一题题单
如果你在题库做题时遇到了喜欢的题目,欢迎推荐给邓老师~ 点击查看详情
题解
本题设计得比较巧,但是乍一看有可能毫无思路……
我们首先来考虑一些简单的问题:
给你一张连通图,让你给边标上0或者1,使得任意一个环,里面所有边的边权的异或值为0,求任意方案。
我们考虑不给边直接标记01而是去给点赋值,因为在一个环里,每个点都会贡献两条边,于是如果我们把每条边的值记为他的两个顶点的异或值,那么在每个环里,顶点的异或值都算了两遍,就异或没啦,于是不管我们的顶点值怎么标环的异或值都一定是0!(这个是可以扩展到任意赋值的,不需要值一定是0/1)
那么把求任意方案变成求方案数呢?
我们考虑一下如果每个点任意标0/1会不会把情况算重复?
在一个连通块里,如果原来的点权1变成0,原来0变成1,求出来的边权就会一模一样,其他时候都是不一样的。也就是说,n个点每个点都有两种方案的2^n算出来的是给点赋予权值的方案,对应给边赋权值的方案是两倍关系,所以,n个点的连通图有种方案。
那么图如果不连通呢?
显然对每个连通块都求一下方案数然后乘起来就行。
现在回到题目:有的边权值已经标好了怎么办?
一条边有权值了,会使得它连着的两个点里面的一个是“不自由”的了(值由另外一个点的值和边权决定),注意如果这条边连的两个点都已经是“不自由“的,则需要判断矛盾,如果不矛盾,它也并没有增加”不自由“的点。事实上,我们应该找一下由提前标好权值的边连出来的连通块,在这个连通块中,只有一个点是”自由”的,即只要确定一个点的权值,其他的就全部确定。如果把这个连通块大小记作k_{i},那么这个连通块的存在就会使得方案数需要在原来的基础上(不考虑之前有标记)除以。
注意:有可能最开始数据给出的边本身就是矛盾的(环的异或和已经不为1了),需要判定之后直接输出0。
看完邓老师的题解,记得去做题提高呀~
欢迎各位大佬来做题写题解,也欢迎大家踊跃在当日讨论贴中提问!
活动奖励:
在牛客博客中写出题解,并回复地址
审核通过可获得(依据题目难度和题解的内容而定)
本道题目4月30日中午12:00之前写的题解有获得牛币资格~
牛客博客开通方式
- 如何开通牛客博客:https://www.nowcoder.com/discuss/202952
- 如何使用博客搬家功能:进入博客--->设置--->底部博客搬家
- 如果你对牛客博客有任何意见或建议:牛客博客意见反馈专贴