匈牙利演算法 匹配問題

2021-10-02 09:47:47 字數 1759 閱讀 3114

假期 2020.01

.27

完全匹配:如果乙個匹配中,|x| <= |y| 且匹配數等於|x| ,則稱此匹配為完全匹配;特別的當 |x| = |y|時稱為完美匹配。

常見實現步驟:

用途:主要用於解決一些與二分圖匹配有關的問題,即部圖匹配最常見的演算法。

某公司存在分工問題,一定數量的女員工與男員工搭配,如何搭配才能實現人員的最大利益,即最大匹配問題。

見匈牙利演算法介紹

構建網路,建立鄰接表

初始化所有的頂點未訪問

依次檢查u的鄰接點v,如果v未被訪問,則將v設定為被訪問,並且判斷v是否已經匹配,若沒有,則u,v匹配,否則從v的鄰接點出發,檢查是否有增廣路徑,如果有,就沿增廣路徑反色,再u v匹配,否則返回0

當找不到增廣路徑時,即找到了最大匹配,結束程式

#include

#include

#include

#include

using namespace std;

#define max_size 100

struct vertex vertex[max_size]

;struct edge edge[max_size]

;int match[max_size]

,visited[max_size]

;//匹配陣列,訪問陣列

int current_num =

0,num =0;

void

add_edge

(int u,

int v);;

void

add(

int u,

int v)

;void

print

(int total)

;void

print_flow

(int total)

;int

maxmatch

(int i)

;int

main()

cout <<

"最大匹配是:"

<< num << endl;

print

(ple_total)

;//輸出最終鄰接網路

print_flow

(female_num)

;//輸出最終方案

return0;

}void

add(

int u,

int v)

void

add_edge

(int u,

int v)

intmaxmatch

(int u)}}

return0;

//沒有找到匹配時

資料參考《趣學演算法》

匈牙利演算法(最大匹配問題)

匈牙利演算法 二分圖的最大匹配可以轉換為乙個網路流的問題,但是我們一般使用匈牙利演算法,這種演算法更易於理解,方便編寫。介紹這個演算法之前,首先要介紹一些必要的概念。交錯路 從乙個未匹配點出發,依次遍歷未匹配邊 匹配邊 未匹配邊,這樣交替下去,這條路徑稱為交錯路。增廣路 從乙個未匹配點出發,依次遍歷...

最大匹配問題(匈牙利演算法)

結束簡單圖論演算法,撒花 哈哈哈 這時匈牙利演算法就可以當作月老專用演算法 1 先選乙個陣營 2 進行連線,如果有人,這看他的伴侶,能不能換乙個成立,就換 3 以此類推 得最大匹配數 模板一定不要背,理解就可以打出來,不需要硬背,我反正都是理解記憶 int n1,n2 n1表示第乙個集合中的點數,n...

python實現標籤匹配 匈牙利演算法

coding utf 8 用匈牙利演算法實現標籤的匹配問題,並且輸出最後的標籤 import numpy as np from scipy.optimize import linear sum assignment label np.array 1,1,2,1,1,2,2,2,3,2,2,3,1,3...