#2 REHYANG@2018-07-30 05:25:09
34540
回复
删除
二分图的最大匹配
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 100010
int n,m,p;
int vis[N],g[404][404],my[N];
void Read(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
while(1){
scanf("%d",&p);
if(!p) break;
g[i][p]=1;
}
}
}
bool dfs(int i){
for(int j=1;j<=m;j++){
if(g[i][j]==1&&vis[j]==0){
vis[j]=1;
if(my[j]==0 || dfs(my[j])){
my[j]=i;
return true;
}
}
}
return false;
}
void divide(){
int ans=0;
memset(my,0,sizeof(my));
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
if(dfs(i))
ans++;
}
printf("%d",ans);
}
int main(){
Read();
divide();
return 0;
}