匈牙利算法
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,ans=0; int visit[10100],cow[10100],link[1009][1009]; bool judge(int x) { for (int i=1;i<=m;i++) { if (link[x][i]&&!visit[i]) { visit[i]=1; if (!cow[i]||judge(cow[i])) {cow[i]=x;return true;} } } return false; } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) { int num,x;scanf("%d",&num); for (int j=1;j<=num;j++) scanf("%d",&x),link[i][x]=1; } for (int i=1;i<=n;i++) {if (judge(i)) ans++;memset(visit,0,sizeof(visit));} printf("%d\n",ans); return 0; }