边的大小要注意
二分图最大匹配 熟悉一下代码
代码如下
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct Edge
{
int next,to;
}e[205*205];
int cnt,used[205],linker[205],head[205],n,m;
void addedge(int u,int v)
{
e[cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt++;
}
bool dfs(int u)
{
for(int i=head[u];i!=-1;i=e[i].next) {
int v=e[i].to;
if(!used[v]) {
used[v]=1;
if(linker[v]==-1||dfs(linker[v])) {
linker[v]=u;
return true;
}
}
}
return false;
}
int maxmatch()
{
int ans=0;
memset(linker,-1,sizeof(linker));
for(int i=1;i<=n;i++) {
memset(used,0,sizeof(used));
if(dfs(i)) ans++;
}
return ans;
}
int main()
{
while(~scanf("%d%d",&n,&m)) {
memset(head,-1,sizeof(head));
cnt=0;
for(int i=1;i<=n;i++) {
int j;
scanf("%d",&j);
while(j--) {
int x;
scanf("%d",&x);
addedge(i,x);
}
}
printf("%d\n",maxmatch());
}
}