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;
}