您的位置:首页 > 其它

二分图最大匹配算法模板

2017-03-16 21:54 295 查看
定义:把一个图的顶点划分为两个不相交集 U  和 V ,使得每一条边都分别连接U 、 V  中的顶点。如果存在这样的划分,则此图为一个二分图。

问题:

如果在某一对男孩和女孩之间存在相连的边,就意味着他们彼此喜欢。那最多有多少互相喜欢的男孩/女孩可以配对?

模板:

/*
输入k,m,n。分别表示可能的配对数目,女生的人数,男生的人数。
求:
互相喜欢的男女生对数。
*/
#include<cstdio>
using namespace std;
const int maxn =505;
int m,n; /*男生和女生的人数*/
int g[maxn][maxn];/*邻接矩阵,下标从0开始;表示男女生关系*/
int linker[maxn];/*i喜欢的人*/
int visited[maxn];

int dfs(int i)
{
for(int j=0;j<n;j++)
if(g[i][j]&&!visited[j])
{
visited[j]=1;
if(linker[j]==-1||dfs(linker[j]))
{
linker[j]=i;
return 1;
}
}
return 0;
}

int hungary()
{
int res=0;
memset(linker,-1,sizeof(linker));
for(int i=0;i<m;i++)
{
memset(visited,0,sizeof(visited));
if(dfs(i)) res++;
}
return res;
}

int main()
{
// freopen("input.txt","r",stdin);
int a,b,k;
while(~scanf("%d",&k)){
if(k==0) break;
scanf("%d%d",&m,&n);
memset(g,0,sizeof(g));
for(int i=0;i<k;i++){
scanf("%d%d",&a,&b);
g[a-1][b-1]=1;/*表示a,b之间可以配对*/
}
printf("%d\n",hungary());
}
return 0;
}
例题:过山车
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息