匈牙利演算法

2022-08-10 20:12:11 字數 1494 閱讀 4083

(一)首先明確匈牙利演算法是幹嘛滴?

匈牙利演算法是解決二部圖最大匹配問題滴。

(二)演算法的核心思想:不斷尋找增廣路徑,每找到一條增廣路徑,就通過異或操作使匹配邊數加一,直到找不到增廣路徑,演算法結束。

(三)演算法的基本步驟:

(1)任取二部圖g(x,y)的匹配m,若m飽和x,則停止。若m不能飽和x,則取x的未標記的m非飽和點x。(標記的點表示經過此點不存在增廣路)令s=,t= ø.(t集合中的點表示n(s)中已經加入增廣路的點)(當不存非飽和點或者所有非飽和點都被標記,演算法結束)

(2)若n(s)=t,(s集合中的所有點的對應項都是已經走過的的點)則返回(1),即無經過x的增廣通路,標記x。否則,取y ∈n(s)-t。

(3)若y是m飽和的,則存在z ∈x-s使yz ∈m.令s=s∪,t=t∪,轉入(2)。若y是m非飽和的,則g中存在以x為起點y為終點的m增廣通路p。用令m=m異或ep,即將這條增廣路上的已匹配邊與未匹配邊對換,得到比原來匹配數多一的新匹配,轉入(1).

(四)演算法的核心結構

1

void hungary()//

匈牙利演算法28

bool findpath(k)//

尋找從k出發的對應項出的可增廣路917

}18}19

則從k的對應項出沒有可增廣路,返回false;

20 }

(五)演算法的核心**

1

bool findpath(intx)2

11}12}

13return

false

;14 }

(六)下面放一道已經ac的題hdu1469

1 #include2 #include3

using

namespace

std;

4#define p 110

5#define n 310

6int

map[p][n];

7int

match[n];

8bool

use[n];

9int

p, n;

1011

bool find(int u) //

u是課程

1223}24

}25return

false;26

}2728int

sum()

2937

return

ans;38}

3940

intmain()

4158

}59 ans =sum();

60 printf("

%s\n

", ans == p ? "

yes" : "no"

);61}62

return0;

63 }

今天剛學完匈牙利演算法,趁熱打鐵,趕快寫篇部落格加深一下印象!看不懂你打我!!!不認真看打死你!!!

匈牙利演算法

匈牙利演算法 edmonds演算法 步聚 1 首先用 標記x中所有的非m頂點,然後交替進行步驟 2 3 2 選取乙個剛標記 用 或在步驟 3 中用 yi 標記 過的x中頂點,例如頂點xi,如果xi與y為同一非匹配邊的兩端點,且在本步驟中y尚未被標記過,則用 xi 去標記y中頂點y。重複步驟 2 直至...

匈牙利演算法

匈牙利演算法用來解決二分圖的最大匹配問題。乙個典型的最大匹配問題的描述如下 乙個公司有n項工作,m個員工。每個員工能勝任n項工作中的幾項 0 n 工作。問題是,如何分配才能使得被處理的工作數最大。當然,如果公司裡人員很多,每項工作都有很多員工可以勝任,那麼使每項工作都有人處理的方案是顯而易見的。但遇...

匈牙利演算法

二分圖匹配的演算法,二分圖就是把圖上的點分成兩個互不相交的點集,而圖中的邊的端點只能分別屬於這兩個點集.二分圖的匹配,就是婚配問題,左邊的點集男性,右邊的點集女性,然後相互配對 一夫一妻 最大匹配就是讓好事最多.匈牙利演算法可以實現這個東西.匈牙利演算法怎麼實現的這個東西.這個比較多.如下 incl...