题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5090
2 5 1 1 2 3 4 5 6 2 1 2 3 4 5 5
Jerry Tom
题意:
有 n 个容器,每个里面有一些珍珠。
可以在任意容器中添加 k 的倍数个珍珠。
问最终是否能使得每个容器分别有1 ~ n颗珍珠。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define MAXN 177
int N;
int g[MAXN][MAXN], linker[MAXN];
bool used[MAXN];
int dfs(int L)//从左边开始找增广路径
{
int R;
for(R = 1 ; R <= N ; R++)//这个顶点编号从0开始,若要从1开始需要修改
{
if(g[L][R]!=0 && !used[R])
{
//找增广路,反向
used[R]=true;
if(linker[R] == -1 || dfs(linker[R]))
{
linker[R]=L;
return 1;
}
}
}
return 0;//这个不要忘了,经常忘记这句
}
int hungary()
{
int res = 0 ;
memset(linker,-1,sizeof(linker));
for(int L = 1; L <= N; L++)
{
memset(used,0,sizeof(used));
if(dfs(L))
res++;
}
return res;
}
int main()
{
int t;
int k, res, tt;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&N,&k);
memset(g,0,sizeof(g));
for(int i = 1 ; i <= N ; i++ )
{
scanf("%d",&tt);
while(tt <= N)
{
g[tt][i] = 1;
tt+=k;
}
}
res = hungary();
if(res == N)
{
printf("Jerry\n");
}
else
{
printf("Tom\n");
}
}
return 0 ;
}
HDU 5090 Game with Pearls(二分匹配)
原文:http://blog.csdn.net/u012860063/article/details/40716713