Round #149 (Div. 2) D. Dispute——乱搞

题意:给出一个无向图,在给每个顶点染色的同时也给与之相连的顶点染色,每个顶点除了被其他顶点“感染”只能被染色一次,那么对某一些顶点单独染色之后,会得到一个每个顶点被染色次数的序列。给出一个序列,问能否对某一些顶点单独染色,得到一个和给出序列完全不同的序列,即每一个对应的次数都不相同。

关键点就是能想到从零状态(也就是没有一个顶点被染色)开始决策的话,每一步决策都不会影响到前面决策的正确性:因为每一次对顶点染色,序列中所有的值只会增大或不变,而我们又是从零状态开始决策的,那么对于那些我们通过染色使其与给出序列对应次数不同的顶点,在这一次决策后依然和给出序列对应次数不同,通俗来讲,我原本就是通过增大染色次数来和给出的次数不一样的,之后我的次数要么增大要么不变,那么肯定一直和给出的次数不一样了。

r = lambda: map(int, raw_input().split())
n, m = r()
e = [[] for _ in xrange(n)]
for i in xrange(m):
    a, b = r()
    e[a - 1].append(b - 1)
    e[b - 1].append(a - 1)
a = r()
b = [0] * n
q = [i for i in xrange(n) if a[i] == b[i]]
ans = []
while q:
    x = q.pop(0)
    ans.append(x + 1)
    for y in e[x]:
        b[y] += 1
        if a[y] == b[y]: q.append(y)
print len(ans)
print ' '.join(map(str, ans))


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值