您的位置:首页 > 其它

P3386 【模板】二分图匹配

2017-07-25 09:12 357 查看

题目背景

二分图

题目描述

给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数

输入输出格式

输入格式:

第一行,n,m,e

第二至e+1行,每行两个正整数u,v,表示u,v有一条连边

输出格式:

共一行,二分图最大匹配

输入输出样例

输入样例#1:

1 1 1
1 1


输出样例#1:

1


说明

n,m<=1000,1<=u<=n,1<=v<=m

因为数据有坑,可能会遇到v>m的情况。请把v>m的数据自觉过滤掉。

算法:二分图匹配

为什么邻接表A不了,,,,

好奇怪,,

换上邻接矩阵秒过,,,,

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN=1001;
void read(int & n)
{
char c='+';int x=0;bool flag=0;
while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;}
while(c>='0'&&c<='9')x=x*10+(c-48),c=getchar();
flag==1?n=-x:n=x;
}
struct node
{
int u,v,nxt;
}edge[MAXN];
int head[MAXN];
int num=1;
int n,m,e;
void add_edge(int x,int y)
{
edge[num].u=x;
edge[num].v=y;
edge[num].nxt=head[x];
head[x]=num++;
}
int vis[MAXN];
int link[MAXN];
int ans=0;
int map[MAXN][MAXN];
bool dfs(int x)
{
/*for(int i=head[x];i!=-1;i=edge[i].nxt)
{
if(!vis[edge[i].v])
{
vis[edge[i].v]=1;
if(!link[edge[i].v]||dfs(link[edge[i].v]))
{
link[edge[i].v]=x;
return 1;
}
}
}
return 0;*/
for(int i=1;i<=m;i++)
{
if(map[x][i]&&!vis[i])
{
vis[i]=1;
if(!link[i]||dfs(link[i]))
{
link[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
memset(head,-1,sizeof(head));
read(n);read(m);read(e);
for(int i=1;i<=e;i++)
{
int x,y;
read(x);read(y);
if(x>n||y>m)continue;
//add_edge(x,y);
map[x][y]=1;
}
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
ans++;
}
printf("%d",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: