配对方案问题匈牙利算法

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
请按任意键继续. . .
 * */



以上是关于配对方案问题匈牙利算法的主要内容,如果未能解决你的问题,请参考以下文章

二分图匹配/匈牙利算法飞行员配对方案问题

网络流24题 第一题 - 洛谷2756 飞行员配对方案 二分图匹配 匈牙利算法

P2756 飞行员配对方案问题 二分图匹配 匈牙利算法

「网络流24题」1. 飞行员配对方案问题

飞行员配对方案问题

P2756 飞行员配对方案问题