题目大意
给定一个树,A可以选一个未染色结点染成白色 B有k次机会可以在任何时候切断一条连边,B可以选一个未染色结点染成黑色,同时和这个结点连接的点也会变成黑色(无论是白色还是未染色),本题是个无向图。最后还有白色的结点那么A赢否则B赢。
分析
如果Bob能把这棵树分成若干两个一组的点对,那么Bob取得胜利,否则Alice获胜
代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN=5005;
int T;
int n,k;
int fa[MAXN];
bool bj[MAXN];//bj[i]为1表示染色了
int cnt;
struct Edge
{
int v;
int next;
}edge[MAXN];
int edgecount;
int head[MAXN];
void Init()
{
edgecount=0;
memset(bj,0,sizeof(bj));
memset(head,-1,sizeof(head));
}
void Add_edge(int u,int v)
{
edge[++edgecount].v=v;
edge[edgecount].next=head[u];
head[u]=edgecount;
}
void Dfs(int u,int p)
{
for(int k=head[u];k!=-1;k=edge[k].next)
{
int v=edge[k].v;
Dfs(v,u);
}
if(bj[u]==0 && bj[p]==0 && u!=1){bj[u]=bj[p]=1;cnt+=2;}
}
int main()
{
scanf("%d",&T);
while(T--)
{
Init();
scanf("%d%d",&n,&k);
for(int i=2;i<=n;i++)
{
scanf("%d",&fa[i]);
Add_edge(fa[i],i);
}
cnt=0;
Dfs(1,0);
if(cnt==n && (n-1-n/2)<=k)cout<<"Bob"<<endl;//可以两两匹配
else cout<<"Alice"<<endl;
}
}
/*
5
6 6
1 2 3 4 3
*/