看到网上一句话挺搞笑的说匈牙利算法是介绍对象的算法。。
x为男方,y为女方,Xi喜欢多个女孩怎么办,必须让一个男孩配一个女孩,所以匈牙利算法就来了。。。
下面是网上的一段代码:
#include<iostream>
#include<stdio.h>
#define maxn 10//表示x集合和y集合中顶点的最大个数!
int nx=8,ny=8;//x集合和y集合中顶点的个数
int edge[maxn][maxn];//edge[i][j]为1表示ij可以匹配
int cx[maxn],cy[maxn];//用来记录x集合中匹配的y元素是哪个!
int visited[maxn];//用来记录该顶点是否被访问过!
int path(int u)
{
int v;
for(v=1;v<=ny;v++)
{
if(edge[u][v]&&!visited[v])
{
visited[v]=1;
if(cy[v]==-1||path(cy[v]))//如果y集合中的v元素没有匹配或者是v已经匹配,但是从cy[v]中能够找到一条增广路
{
cx[u]=v;
cy[v]=u;
return 1;
}
}
}
return 0;
}
int maxmatch()
{
int res=0;
memset(cx,0xff,sizeof(cx));//初始值为-1表示两个集合中都没有匹配的元素!
memset(cy,0xff,sizeof(cy));
for(int i=1;i<=nx;i++)
{
if(cx[i]==-1)
{
memset(visited,0,sizeof(visited));
res+=path(i);
}
}
return res;
}
int main()
{
edge[1][1]=edge[1][2]=edge[1][4]=edge[2][2]=edge[2][5]=edge[3][1]=edge[3][4]=edge[3][7]=edge[4][3]=edge[4][4]=edge[4][6]=edge[5][4]=edge[6][4]=1;
maxmatch();
}
这个是我的代码,改的和他的差不多了,但是通俗,本人看起来熟悉,所以就贴上来吧。。。
#include<iostream>
int xiongyali(int i);
int xx();
int visit[8];
int x[8],y[8];
int lx[8][8];
int main()
{
int i;
memset(y,0,8*4);
memset(lx,0,64*4);
lx[1][1]=lx[1][2]=lx[1][4]=lx[2][2]=lx[2][5]=lx[3][1]=lx[3][4]=lx[3][7]=lx[4][3]=lx[4][4]=lx[4][6]=lx[5][4]=lx[6][4]=1;
xx();
}
int xiongyali(int i)
{
int k;
for(int j=1;j<8;j++)
{
if(lx[i][j]==1&&visit[j]==0)
{
visit[j]=1;
if(y[j]==0||xiongyali(y[j]))
{
x[i]=j;
y[j]=i;
return 1;
}
}
}
return 0;
}
int xx()
{
for(int k=1;k<8;k++)
{
for(int j=1;j<8;j++)
visit[j]=0;
xiongyali(k);
}
return 1;
}