[hdu6105]Gameia

题目大意

有一颗n个节点的树,每个节点初始没有颜色。A和B玩游戏,A先手。B有k次小动作,可以在游戏进行的任意时刻使用(可以在A操作前后使用,一次性可以使用多次),每次小动作他会选择切掉一条树边。
两人轮流操作,A每次将一个无色点染白,B每次将一个无色点染黑并将相连点染黑(即使已经有颜色)。当不能操作后,如果存在被染白的点,A胜,否则B胜。双方绝顶聪明,问谁胜。

博弈题

先给出的结论:
该树如果有完美匹配,且小动作次数可以一开始把原树分裂成若干点对,则B胜利,否则A胜利。
我们来证明一下。
如果没有完美匹配,A可以每次选择一个叶子的父亲,来以此胁迫B染叶子节点,那么就有两个节点变黑,一起删去,变成子问题。
如果最后变成只有一个节点A直接染就赢了(因此n为奇数A必胜,n为奇数时也不存在完美匹配)。
可以看出这样子下去因为不存在完美匹配,总会出现一个时刻B赶不上A的节奏(你感受一下,如果B能跟得上A那就恰好出现了完美匹配,这是充分必要的,因此没有完美匹配是跟不上的)。
那如果有完美匹配,但小动作次数不够呢?
A会每次选择一个叶子染白,要保证其父亲只有它这一个子节点(如果找不到这种叶子,必然存在一个父亲有两个子树叶,这时显然是A胜),然后会逼迫B染黑,但是染黑有连带影响,这个父亲显然度数为2,那么会使得剩余树大小为奇数,那么B必败,因此B会采取小动作切树边。如果小动作不够B就会GG了。
而小动作够的话显然直接按匹配切就能保证自己胜了。
附wxh010910代码

#include <bits/stdc++.h>
#define xx first
#define yy second
#define mp make_pair
#define pb push_back
#define mset(x, y) memset(x, y, sizeof x)
#define mcpy(x, y) memcpy(x, y, sizeof x)
using namespace std;

typedef long long LL;
typedef pair <int, int> pii;

inline int Read()
{
    int x = 0, f = 1, c = getchar();
    for (; !isdigit(c); c = getchar())
        if (c == '-')
            f = -1;
    for (;  isdigit(c); c = getchar())
        x = x * 10 + c - '0';
    return x * f;
}

const int MAXN = 505;

int n, m, par[MAXN], col[MAXN];
vector <int> adj[MAXN];

inline void Sol()
{
    n = Read(); m = Read();
    int cnt = n;
    for (int i = 1; i <= n; i ++)
        adj[i].clear();
    for (int i = 2; i <= n; i ++)
        par[i] = Read(), adj[par[i]].pb(i);
    for (int x = n; x; x --)
    {
        col[x] = 1;
#define y adj[x][i]
        for (int i = 0; i < adj[x].size(); i ++)
            if (col[y])
                col[x] = 0;
        cnt -= col[x];
    }
    if (n % 2 == 0 && cnt == n / 2 && m >= n / 2 - 1)
        puts("Bob");
    else
        puts("Alice");
}


int main()
{
    for (int T = Read(); T; T --)
        Sol();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值