UVa 193 图着色

题意:给一个图,可以染白色和黑色,但是染黑色的结点不能相邻。求最多的黑色结点个数,和一种可能的黑色结点序列。

思路:这个用回溯法还是很容易想到怎么写的。dfs每一个位置,知道所有位置dfs完。对每个位置都尝试黑色和白色。如果染黑色,那么就需要把和它相邻的结点染成白色,因为他们必须是白色,如果发现有相邻结点已经是黑色,则当前结点不能是黑色;而因为dfs后需要对辅助的全局变量进行恢复,所以这里在将相邻结点染成白色前先判断它是不是已经是白色了,因为如果它已经是白色在恢复的时候就不需要再恢复了,否则需要把它恢复成未染色的状态。  程序实现,我用的是color数组,0表示未染色,1表示黑色,2表示白色。dfs只需要对未染色的结点进行详细考虑,其中在染成黑色时用一个数组保存了相邻的、本来就是白色结点的结点编号;已染色的结点只要简单地dfs下一位置即可。

注意:这里结点的编号是从1到n,数组要开够,而且循环的索引及范围要注意下。

            第二个,就是要注意全局变量的初始化。这里特别要注意的是g数组的初始化,之前以为反正是要赋值的,就没初始化。。。之后发现边数为0的话,那g数组就是上个数据的了。。其实,就算边数不为0,是其他的数,g数组不初始化的话,上一数据的边的关系还是会残留在这组数据的。。。

            第三个,就是输出的时候,给出一种可能的序列就可以了。最后一个数之后没有空格,直接回车。否则会 PE 错误。(终于遇到一次PE了啊,之前记得格式错很多都提示WA的,所以这题第一次WA的时候,怀疑是不是输出的原因,结果并不是。。。)</

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值