题解:只有当bob把图切成所有端点有且只有一条边的时候bob才有可能赢所以当bob所有的点都有匹配并且点为偶数,同时要满足k>=n-1-n/2才能赢
所以直接二分匹配再判断一下就可以了
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<set>
#include<vector>
using namespace std;
const int mx = 1005;
int y[mx];
int vis[mx];
vector<int>g[mx];
int n,k;
bool find(int u){
for(auto v: g[u]){
if(!vis[v]){
vis[v] = 1;
if(!y[v]||find(y[v])){
y[v] = u;
return true;
}
}
}
return false;
}
bool MaxMatch(){
if(n&1)
return false;
//cout<<1<<endl;
memset(y,0,sizeof(y));
for(int u = 1; u <= n; u++){
memset(vis,0,sizeof(vis));
if(!find(u))
return false;
}
//cout<<n<<endl;
// cout<<n-1<<endl;
//cout<<n-1-n/2<<endl;
return k>=n-1-n/2;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
for(int i = 1; i <= n; i++)
g[i].clear();
for(int i = 2; i <= n; i++){
int v;
scanf("%d",&v);
g[i].push_back(v);
g[v].push_back(i);
}
MaxMatch()?puts("Bob"):puts("Alice");
}
return 0;
}