HDU6105-二分匹配

来源:互联网 发布:center os安装windows 编辑:程序博客网 时间:2024/05/21 13:59

题解:只有当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;}