二分匹配匈牙利算法
#define parray 101
#define narray 301
int map[parray][narray]; //存储邻接矩阵
int match[narray]; //存储匹配
bool final[narray]; //用于标记DFS
int p,n; //p代表二分图左半顶点个数,n代表二分图右半顶点个数
//利用DFS算法找增广路路径
bool DFS(int p)
{
int i,t;
for(i=1;i<=n;++i)
{
if(map[p][i] && !final[i])
{
final[i]= true;
t = match[i];
match[i] = p;
if(t==0 || DFS(t)) return true; //由二分图中的增广路径的性质可知,起点和终点都是目前还没有配对的点,而其它所有点都是已经配好对的。
match[i] = t; //注意二分匹配时不必在此处回溯时改变final的值,如果从一个点A出发,没有找到增广路径,那么无论再从别的点出发找到多少增广路径来改变现在的匹配,从A出发都永远找不到增广路径。
}
}
return false;
}
int mat()
{
int i,j;
int maxmatch = 0; //最大匹配数
for(i=1;i<=p;++i) //遍历二分图左半边的每个顶点,寻找增广路径
{
memset(final,0,sizeof(final)); //每次找寻增广路径时final初始化
if(DFS(i)) maxmatch++;
}
return maxmatch;
}
int main()
{
scanf("%d%d",&p,&n);
memset(map,0,sizeof(map)); //初始化邻接矩阵
memset(match,0,sizeof(match)); //初始化匹配
mat();
return 0;
}