(一)首先明確匈牙利演算法是幹嘛滴?
匈牙利演算法是解決二部圖最大匹配問題滴。
(二)演算法的核心思想:不斷尋找增廣路徑,每找到一條增廣路徑,就通過異或操作使匹配邊數加一,直到找不到增廣路徑,演算法結束。
(三)演算法的基本步驟:
(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).
(四)演算法的核心結構
1void hungary()//
匈牙利演算法28
bool findpath(k)//
尋找從k出發的對應項出的可增廣路917
}18}19
則從k的對應項出沒有可增廣路,返回false;
20 }
(五)演算法的核心**
1bool findpath(intx)2
11}12}
13return
false
;14 }
(六)下面放一道已經ac的題hdu1469
1 #include2 #include3using
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...