就是记录每个被匹配点此时的匹配数量和匹配到的这几个点的信息
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
#include<vector>
#define maxn 1005
using namespace std;
int n,m,used[maxn],flag[maxn][maxn],am[maxn];
vector<int>ve[maxn];
string s1;
bool dfs(int pre,int maxi)
{
for(int i=0;i<ve[pre].size();i++)
{
int j = ve[pre][i];
if(!used[j])
{
used[j] = 1;
if(am[j]<maxi)
{
flag[j][++am[j]] = pre;
return true;
}
for(int k=1;k<=am[j];k++)
if(dfs(flag[j][k],maxi))
{
flag[j][k] = pre;
return true;
}
}
}
return false;
}
int match(int maxi)
{
int ans = 0;
memset(am,0,sizeof(am));
for(int i=1;i<=n;i++)
{
memset(used,0,sizeof(used));
ans += dfs(i,maxi);
}
return ans;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)break;
for(int i=1;i<=n;i++)
{
int a;
cin>>s1;
while(true){
scanf("%d",&a);
ve[i].push_back(a+1);
if(getchar()=='\n')break;
}
}
int l = 1,r = n,mid,ans = 0;
while(l<=r)
{
mid = (l+r)/2;
if(match(mid)==n)
{
ans = mid;
r = mid-1;
}
else l = mid+1;
}
printf("%d\n",ans);
for(int i=1;i<=n;i++) ve[i].clear();
}
return 0;
}