我学艺不精,只能刷刷模板来练一下手
这是一道二分匹配的模板题目,一路套算法就行了
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int pipei[250];
int used[250];
bool mapp[250][250];
int m,n;
bool dfs(int r)
{
int i;
for(i=1;i<=n;i++)
{
if(!mapp[r][i])continue;
if(used[i])continue;
used[i]=1;//已动过
if(pipei[i]==-1||dfs(pipei[i]))
{
//找到了所以谷仓的位置被r这头牛占据
pipei[i]=r;
return true;
}
}
return false;
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(pipei,-1,sizeof(pipei));//记录匹配到的牛的编号
memset(mapp,false,sizeof(mapp));
int d,a;
int i;
for(i=1;i<=m;i++)
{
scanf("%d",&d);
while(d--)
{
scanf("%d",&a);
mapp[i][a]=true;
}
}
int sum=0;
for(i=1;i<=m;i++)
{
memset(used,0,sizeof(used));
if(dfs(i))//如果能找到就腾出一个位置给那头牛
sum++;
}
printf("%d\n",sum);
}
return 0;
}