匈牙利算法
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int head[N],Next[N],ver[N],v[N],match[N];
int tot=0,ans=0;
void add(int x,int y){
ver[++tot]=y;Next[tot]=head[x];head[x]=tot;
}
bool dfs(int x){
for(int i=head[x],y;i;i=Next[i]){
if(v[y=ver[i]]==ans) continue;
v[y]=ans;
if(match[y]==0||dfs(match[y])){
match[y]=x;
return 1;
}
}
return 0;
}
int main(){
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;++i){
int t,x;cin>>t;
while(t--)scanf("%d",&x),add(i,x),add(i+n,x);
}
ans=1;
for(int i=1;i<=n;++i){
if(dfs(i)) ++ans;
}
for(int i=n+1;i<=n*2;++i){
if(k>0&&dfs(i)) ++ans,--k;
}
cout<<ans-1<<endl;
}