二分匹配


1.Hungary(邻接阵形式)

#include <iostream>
#include <algorithm>

#define MAXN 501  //左边的点
#define MAXM 501  //右边的点
int map[MAXN][MAXM];
int p[MAXN];//保存匹配的结果, 初始化为-1
bool v[MAXN];
int n, m;//左边n个点,右边m个点
bool dfs(int x)//模版代码 实现部分  
{
	int y;
	for(y = 1; y <= m; y++)  //注意m的取值范围
	{
		if(map[x][y] && v[y] == 0)
		{
			v[y] = 1;
			if(p[y] == -1 || dfs(p[y]))
			{
				p[y] = x;
				return 1;
			}
		}
	}
	return 0;
}
int main()
{
	int sum = 0;//保存匹配的数量
	//build map[] first;
	memset(p, -1, sizeof(p));
	for(int i = 1; i <= n; i++)
	{
		memset(v, 0, sizeof(v));
		sum += dfs (i);
	}
	cout << sum << endl;
	return 0;
}

2.Hungary(邻接表形式)

#define FF(i,n)	for(int i = 0 ; i < n; i ++)
const int maxn = 100;    //点
const int maxm = 10000; //边
int head[maxn];
struct Node{
	int next;
	short pos;
}E[maxm];
int NE , NV;		//NV代表行数,NE代表边数
short Link[maxn];	//Link表示的就是匹配的是谁
bool vis[maxn];

int dfs(int u) {
	for(int i = head[u] ; i != - 1; i = E[i].next) {
		int v = E[i].pos;
		if(vis[v])	continue;
		vis[v] = true;
		if(Link[v] == -1 || dfs(Link[v])) {
			Link[v] = u;
			return 1;
		}
	}
	return 0;
}
int match() {
	int ret = 0;
	memset(Link,-1,sizeof(int)*NV);
	FF(i,NV) {
		memset(vis,false,sizeof(bool)*NV);
		ret += dfs(i);
	}
	return ret;
}
void Insert(int u,int v) {		//建图,u到v连边
	E[NE].next = head[u];
	E[NE].pos = v;
	head[u] = NE++;
}
void init() {
	FF(i,NV) head[i] = -1;
	NE = 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值