hdu 5090 Game with Pearls (二分匹配)

来源:互联网 发布:中国联通淘宝旗舰店 编辑:程序博客网 时间:2024/06/05 05:50
///给你n个管子原先有些珍珠///对这些管子有两种操作 1:不加珍珠 2: 加k倍数数目的珍珠///如果能使管子里的珍珠为1.2.3.4....n Jerry赢///解法:二分匹配# include<stdio.h># include<algorithm># include <iostream># include<string.h>using namespace std;int map[110],pp[110][110],n,vis[110];int bfs(int x){    for(int i=1; i<=n; i++) //B组中的人来迎合匹配    {        if(!vis[i]&&pp[x][i])        {            vis[i]=1;            if(!map[i]||bfs(map[i]))//b中i还没匹配或与之匹配的A组中的数(map[i])还能找到其他人匹配            {                map[i]=x;                return 1;            }        }    }    return 0;}int main(){    int t,i,a[110],k;    while(~scanf("%d",&t))    {        while(t--)        {            scanf("%d%d",&n,&k);            memset(pp,0,sizeof(pp));            memset(map,0,sizeof(map));            for(i=0; i<n; i++)            {                scanf("%d",&a[i]);            }            for(i=0; i<n; i++)            {                int tt=a[i];                while(tt<=n&&a[i]<=n)                {                    pp[a[i]][tt]=1;///每个管子可以匹配的容量                    tt+=k;                }            }            int count=0;            for(i=0; i<n; i++)            {                memset(vis,0,sizeof(vis));                if(bfs(a[i]))                    count++;            }           // printf("%d\n",count);            if(count==n)                printf("Jerry\n");            else                printf("Tom\n");        }    }    return 0;}

0 0