【博弈论】红与蓝-rab

这是一个关于博弈论的问题,小红和小蓝在树形结构中轮流给无色叶子节点染色,最终根据子节点颜色多数决定非叶节点颜色,根节点颜色决定胜负。小红需在无法立即确定胜负时,染色以确保后续占有优势。通过DFS推断固定颜色的节点,并采取策略保证先手必胜。
摘要由CSDN通过智能技术生成

没有传送门,题解原始idea来自下面这篇博文。
1-1 T2 rab(博弈论)


题意

    给定一棵树,初始时非叶节点均为无色,叶节点会是红色、蓝色或无色。
    小红和小蓝轮流给无色叶子染色(小红染红色,小蓝染蓝色,小红先染)。所有叶子染完后,非叶节点的颜色将被逐一确定:一个非叶节点的颜色是它所有儿子的颜色中出现较多的那个(保证有奇数个儿子)。最后,根是谁的颜色谁就获胜。
    求小红是否能赢,若能赢,求出第一步选择哪些叶子能赢。


数据范围

对于20%的数据,t=1,n≤20。

对于60%的数据,n≤2000。

对于100%的数据,t≤10,n≤100000。


题解

    看的是如上大佬的题解,已经讲的很清楚了。
    我们现根据已染色点dfs推断出所有颜色一定了的节点。
    若此时已经可以得出根节点的颜色,那么小红第一次染色就随便染,即任意一个未被染色的叶节点。
    若此时还并能确定,那么为了保证小红的最终胜利,一定要占领先机,即先把有儿子未染色且这个非叶节点颜色也不确定的染了(保证这个节点为红),接着把蓝儿子比红儿子多一的染了(因为如果多于了一,染它的儿子显然是无用的,这里其实并不是很显然,因为我思考的时候就是在这里卡了)。
    补充一下:
    关于博弈论,由最后一步必胜不断递归转移。所以对上一段操作可以这样理解:当我们把蓝儿子多一的染成无色后,小蓝染色时,无论他选择新的节点染色还是就在这个节点上又恢复蓝儿子多一的状态,对于小红都是可以在这个基础上又新占领一个非叶节点的。而这样每轮两人各加一,先手必胜,则小红赢。
    分析的时候,假设对于某非叶节点,若为无色(或红儿子数等于蓝儿子数)并还有儿子未被染色,由于小红先行的规则,则可以保证染了一个叶节点就可以使这个节点为红。
    具体的看代码的实现吧。


代码

#include<cstdio>
#include<cstring>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值