hdu2063(二分图最大匹配)
来源:互联网 发布:windows whistler2296 编辑:程序博客网 时间:2024/06/05 20:36
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。它是一种用增广路径求二分图最大匹配的算法。
贴网站
http://blog.csdn.net/dark_scope/article/details/8880547
加一些自己的理解
对于这个dfs,比较难理解的是used
int dfs(int u)
{
for(int v=1;v<=m;v++)
{
if(ch[u][v]==1&&!used[v])
{
used[v]=1;
if(link[v]==0||dfs(link[v]))
{
link[v]=u;
return1;
}
}
}
return0;
}
used的作用是用来记录虚线,就是图中的黄线
这表示在递归的过程中这个男生不能配对因为他正在配对待机中,(题目和图片的男生女生是反着的)
同时used!=0也代表了在这次查询中这个男生已经没希望了
下次配对used清零
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespacestd;
int n,m,ch[1005][1005],used[1005],link[1005];
int dfs(int u)
{
for(int v=1;v<=m;v++)
{
if(ch[u][v]==1&&!used[v])
{
used[v]=1;
if(link[v]==0||dfs(link[v]))
{
link[v]=u;
return1;
}
}
}
return0;
}
int main()
{
int k,x,y,ans;
while(~scanf("%d",&k)&&k!=0)
{
ans=0;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ch[i][j]=0;
while(k--)
{
scanf("%d %d",&x,&y);
ch[x][y]=1;
}
memset(link,0,sizeof(link));
for(int i=1;i<=n;i++)
{
memset(used,0,sizeof(used));
if(dfs(i)==1)
ans++;
}
printf("%d\n",ans);
}
return0;
}
- HDU2063 过山车(二分图最大匹配)
- hdu2063(二分图最大匹配)
- HDU2063二分图最大匹配
- hdu2063 二分图最大匹配
- hdu2063 过山车 二分图/最大匹配(匈牙利算法)
- 【HDU2063】过山车(二分图最大匹配,匈牙利算法)
- Hdu2063—过山车 二分图最大匹配
- hdu2063(二分图的最大匹配)
- HDU2063 过山车 【二分图·最大匹配】
- 【二分图最大匹配】【HDU2063】过山车
- 【最大流,二分图匹配】【hdu2063】【过山车】
- HDU2063过山车 匈牙利二分图最大匹配
- hdu2063(二分图的最大匹配)
- hdu2063 过山车(二分图最大匹配基础)
- HDU2063--过山车(二分匹配,二分图)
- HDU2063(二分图匹配模板题)
- hdu2063 过山车 二分图最大匹配 匈牙利算法
- 二分图最大匹配-增广路-hdu2063-过山车
- ORA-12154TNS
- 练习1-return-try-canth-fianlly和方法形参的传递
- Cassandra错误总结
- for in、for of、forEach的区别
- Java中 方法的定义与使用
- hdu2063(二分图最大匹配)
- ffmpeg下载
- HDOJ2072单词数
- 第五章 编程小事
- Hibernate学习笔记 之 configuration、sessionFactory、session
- dubbo 5 Listener和Filter
- bzoj 4004
- 【推荐系统】推荐系统重要会议和期刊
- 韩版宠物问题