Description
模板题洛谷 P3386
这道题数据有点问题大家注意 数组尽量开大
给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数
Solution
过程大概是这样的
male一边向female配对:男1找到了女1,女1还没有被匹配过,匹配成功 link[1]=1
男2也找到了女1,但女1已经与男1匹配了,这时候我们给男1重新匹配到了未被匹配过的女2(link[2]=1),所以男2可以与女1匹配了(link[1]=2),匹配成功
然后以此类推blahblah…
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define MAXN 1000000
using namespace std;
struct Node
{
int next,to;
}edges[MAXN*2+5];
int head[MAXN+5],n,m,e,cnt=0,ans=0,link[MAXN+5],visited[MAXN+5];
void add(int u,int v)
{
edges[++cnt].next=head[u];
edges[cnt].to=v;
head[u]=cnt;
}
bool dfs(int i)
{
for(int j=head[i];~j;j=edges[j].next)
{
int to=edges[j].to;
if(!visited[to])
{
visited[to]=1;
if(!link[to]||dfs(link[to]))
{
link[to]=i;
return true;
}
}
}
return false;
}
int main()
{
scanf("%d%d%d",&n,&m,&e);
memset(head,-1,sizeof(head));
int u,v;
for(int i=1;i<=e;i++)
{
scanf("%d%d",&u,&v);
if(u<=n&&v<=m)
add(u,v);
}
for(int i=1;i<=n;i++)
{
memset(visited,0,sizeof(visited));
if(dfs(i))ans++;
}
printf("%d\n",ans);
return 0;
}