哈利波特中魔杖选择主人的梗,n个人,m根魔棒,给出每根魔棒会选择的人,求最大匹配,裸模板题。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int maxn=111;
int n,m;
int ans;
int map[maxn][maxn];
int visit[maxn];
int link[maxn];
bool dfs(int k)
{
int j;
for(int i=1;i<=m;i++)
{
if(!visit[i]&&map[k][i])
{
visit[i]=1;
j=link[i];
if(j==-1||dfs(j))
{
link[i]=k;
return true;
}
}
}
return false;
}
int hungary()
{
memset(link,-1,sizeof(link));
int sum=0;
for(int i=1;i<=n;i++)
{
memset(visit,0,sizeof(visit));
if(dfs(i))
{
sum++;
}
}
return sum;
}
int main()
{
int num;
int x;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(map,0,sizeof(map));
for(int i=1;i<=m;i++)
{
scanf("%d",&num);
while(num--)
{
scanf("%d",&x);
map[x][i]=1;
}
}
cout<<hungary()<<endl;
}
return 0;
}