一开始题目看见input里farther,完全没理解,后来看见admin说其实是father,但题目里也没修改,坑。。
还有就是切掉一条边,对节点无影响,只是bob无法将颜色染过去;
然后bob也只能涂空的节点,然后将直接用边连接的节点全变为黑的(一开始以为能涂在白色上)
比赛时莫名wa。。找不到原因,结束后看了数据结果我判断的是k 与 n / 2 的大小,实际上是k 与 n / 2 - 1 的大小。无语;
思路
1首先A如果选择端点附近的点,那么B必须染端点,所以能控制两个两个一起变黑,使vip功能失效,所以n如果是奇数,A必赢;
2如果n是偶数,A也可以通过选择端点,那b必须选择端点直接连接的点,且b必须使用功能;不然个数变成奇数,走上面那条;所以要比较k 与 n / 2 - 1 大小,判断功能次数是否足够
3如果次数足够,就要考虑 出现某个结点有>=2个子节点为叶子节点。A染这个点,B跟不上A的节奏,出现孤点,Ailice取胜;
我打的代码太繁琐了,所以贴一个简单又好理解的
http://blog.csdn.net/qq_37412229/article/details/77093330
#include <bits/stdc++.h>
using namespace std;
const int maxn=1000;
int n, k, father[maxn], size[maxn];
int main()
{
int t;
cin >> t;
while(t --)
{
bool flag = true;
cin >> n >> k;
for(int i = 2; i <= n; ++ i)
cin >> father[i];
for(int i = 1; i <= n; ++ i)
size[i] = 1;
for(int i = n; i >= 1; -- i)
{
if(size[i] >= 3)
flag = false;
size[father[i]] += size[i] & 1;
}
if(flag && n % 2 == 0 && k >= n / 2 - 1)
cout << "Bob" << endl;
else
cout << "Alice" << endl;
}
return 0;
}