您的位置:首页 > 其它

HDU 2064 二分图 匈牙利算法 零基本教学

2015-11-08 15:33 369 查看
在从来没有接触过图论的基础上学习了匈牙利算法和二分图

网上的资料大多需要知道一点图论的基本知识,为了和我一样的人能够看懂,就写一下零基础的。

先要看明白匈牙利算法,下面这篇文章,小白也能看懂。
http://blog.csdn.net/dark_scope/article/details/8880547
看完之后再看这个代码,整个代码就是按照上面那篇文章的方式,一模一样的来进行计算的

#include<string.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<cstdio>
using namespace std;
bool vis[510];
bool lj[510][510];//记录某男生和某女生的连接,若可以连接则为1,反之为0
int map[510];//记录某个男生匹配了某个女生。如map[3]=1 即第三个男生匹配了第一个女生
int m,n;

int find(int p)
{
int i,j;
for(i = 1; i <= n; i++)
{
if(!vis[i]&&lj[p][i])
{
vis[i] = 1;
if(!map[i] || find(map[i]))
{
map[i] = p;
return 1;
}
}
}
return 0;
}

int main()
{
int k,a,b,i,j,ans;
while(~scanf("%d",&k) && k)
{
ans = 0;//用于记录总的匹配对数
memset(lj,0,sizeof(lj));
memset(map,0,sizeof(map));
scanf("%d%d",&m,&n);
while(k--)//
{
scanf("%d%d",&a,&b);
lj[a][b] = 1;
}
for(i = 1; i <= m; i++)//从第一个女生还是索引
{
memset(vis,0,sizeof(vis));
if(find(i)) ans++;
}
printf("%d\n",ans);

}
return 0;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: