配对方案问题匈牙利算法
Posted wanluN1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了配对方案问题匈牙利算法相关的知识,希望对你有一定的参考价值。
配对方案问题匈牙利算法
图片来源《趣学算法》 人民邮电出版社 陈小玉
图片来源《趣学算法》 人民邮电出版社 陈小玉
#include<iostream>
#include<cstring>
using namespace std;
const int INF=0x3fffffff;
const int N=100;
const int M=10000;
int match[N];
bool vis[N];
int top;
struct Vertex{
int first;
}V[N];
struct Edge{
int v,next;
}E[M];
void init(){
memset(V,-1,sizeof(V));
top=0;
memset(match,0,sizeof(match));
}
void add(int u,int v){
E[top].v=v;//增加一条新的边
E[top].next=V[u].first;//头插法
V[u].first=top;
top++;
}
//u:左边边的节点编号 返回值 u是否可以匹配到一个右边的节点
bool maxmatch(int u){
int v;
for(int j=V[u].first;~j;j=E[j].next){//检查u的所有邻接边
v=E[j].v;
if(!vis[v]){//这个邻接点并没有被访问过,才能进行一系列判断,一个被访问过的节点,不是已经匹配就是不能匹配
vis[v]=1;//将这个临界点改为被访问过
if(!match[v]||maxmatch(match[v])){//v未匹配 或 [v的匹配点]找到了其他的匹配
match[u]=v;
match[v]=u;
return true;
}
}
}
return false;
}
int main(int argc,char**argv){
int n,m,total,num=0;
int u,v;
cout<<"输入女推销员数量m和男推销员数量n"<<endl;
cin>>m>>n;
init();
total=m+n;
cout<<"输入可以配和的女推销员编号u和男推销员编号v(当u=-1且v=-1时结束)\\n";
while(cin>>u>>v,u+v!=-2){
add(u,v);
add(v,u);
}
for(int i=1;i<=m;++i){//遍历左边的节点
memset(vis,0,sizeof(vis));//初始化全部没有被访问过
if(maxmatch(i)){//如果i匹配到了左边的节点则总匹配数量+1
++num;
}
}
cout<<"最大匹配数: "<<num<<endl;
cout<<"匹配结果为:\\n";
for(int i=1;i<=m;i++){
if(match[i]!=0){
cout<<i<<"---"<<match[i]<<endl;
}
}
return 0;
}
/*
输入女推销员数量m和男推销员数量n
5 7
输入可以配和的女推销员编号u和男推销员编号v(当u=-1且v=-1时结束)
1 6
1 8
2 7
2 8
2 11
3 7
3 9
3 10
4 12
4 9
5 10
-1 -1
最大匹配数: 5
匹配结果为:
1---8
2---11
3---9
4---12
5---10
--------------------------------
Process exited after 1.75 seconds with return value 0
请按任意键继续. . .
* */
以上是关于配对方案问题匈牙利算法的主要内容,如果未能解决你的问题,请参考以下文章