求二分图最大匹配——匈牙利算法模板。

才开始的时候研究过他,不过当时只是记住的模板刷了几个模板题后一位会了。过上一段时间就忘了。唉。。这次好好研究研究。。

http://baike.baidu.com/view/501081.htm

补充:

最大匹配: 图中包含边数最多的匹配称为图的最大匹配。 
完美匹配: 如果所有点都在匹配边上,称这个最大匹配是完美匹配。 
最小覆盖: 最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和其中一个点关联。可以证明:最少的点(即覆盖数)=最大匹配数 
最小路径覆盖: 
用尽量少的不相交简单路径覆盖有向无环图G的所有结点。解决此类问题可以建立一个二分图模型。把所有顶点i拆成两个:X结点集中的i和Y结点集中的i',如果有边i->j,则在二分图中引入边i->j',设二分图最大匹配为m,则结果就是n-m。 
最大独立集问题: 
在N个点的图G中选出m个点,使这m个点两两之间没有边.求m最大值. 
如果图G满足二分图条件,则可以用二分图匹配来做.最大独立集点数 = N - 最大匹配数

http://acm.hdu.edu.cn/showproblem.php?pid=2063杭电一道模板题,就当模板用了》

View Code
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 507
using namespace std;
int map[maxn][maxn],link[maxn];
int gn,gm,k;
bool visit[maxn];
void init()
{
for (int i = 0 ;i < maxn; ++i)
{
link[i] = -1;
visit[i] = false;
for (int j = 0; j < maxn; ++j)
{
map[i][j] = 0;
}
}
}
bool dfs(int rpos)
{
int i;
for(i = 1; i <= gm; ++i)//对于集合gm循环遍历
{
if (!visit[i] && map[rpos][i])//如果i与rpos有边&&i没被访问过
{
visit[i] = true;
if (link[i] == -1 || dfs(link[i]))//如果i与点集合gn中的点没有边,没有参与匹配的边则找到一条增广路,
//rpos到i存在没有参与匹配的边,而i到link[i]存在参与匹配的边然后往后找直到找到增广路,然后用M‘来代替M增加一条边
{
link [i] = rpos;
return true;
}
}
}
return false;
}
int main()
{
int i,x,y;
while (cin>>k)
{
if (!k) break;
cin>>gn>>gm;//两个点集的数量
init();
while (k--)
{
cin>>x>>y;
map[x][y] = 1;//邻接矩阵记录已连接的边
}
int count = 0;
for (i = 1; i <= gn; ++i)//遍历一个点集
{
memset(visit,false,sizeof(visit));//每次都要将上一次走过的路径清空
if (dfs(i)) count++;//如果能找到count就++记录边数
}
cout<<count<<endl;
}
return 0;
}


http://acm.hdu.edu.cn/showproblem.php?pid=2458   hdu2458 模板题

首先明白:最大独立集=V-最大匹配数;(V为最大顶点数也就是X顶点集+Y顶点集);最大独立集:(最大独立集是指互不相关的点最多有几个,而此处我们把相关的定义为map[][]=0;不相关的定义为map[][]=1;所以最大独立集就是所有互相了解的人的集合,通过匈牙利算法求出不了解人的最大匹配数用最大定点数减去他就是要求的最大独力集了)。。有点逆向思维的感觉。

http://acm.hdu.edu.cn/showproblem.php?pid=1150 hdu 1150 模板题

概念:最小点覆盖集 = 最大匹配数。最小点覆盖集: 最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和其中一个点关联。可以证明:最少的点(即覆盖数)=最大匹配数

这里将机器A,B看做两个集合,如果i既可以在Ai模式下工作又可以在Bi模式下工作则在Ai与Bi之间连接一条边,在最后只要求出用最少的模式将所有工作做完即可,击球最小点覆盖

二分匹配的是难以想象到可以用二分匹配的思想,感觉八竿子达打不到可是就是用它了。。唉。。。

http://poj.org/problem?id=2536 pku 2536 很裸的一个匈牙利算法求最大匹配问题

才开始在isok函数里设了一个形参v与全局变量v冲突了。。老是不对。。检查了半天。。唉。。马虎啊。。n - count

posted @ 2012-02-16 14:51  E_star  阅读(456)  评论(0编辑  收藏  举报