1. 程式人生 > >二分圖——匈牙利算法簡述

二分圖——匈牙利算法簡述

bsp 復習 昨天 目標 一個 之間 color ret pre

昨天模擬,有一道高維宇宙,二分圖匹配是正解,但是二分圖匹配有點忘了,復習一下。

二分圖匹配其實就是兩個集合有一些元素可以匹配,試圖找到最多匹配的一種情況。

二分圖中的兩個可以連得邊用數組來實現。

每一個元素找可以連得邊,如果想要匹配的點已經被人占了,就讓前面的與目標點匹配的點找另一個可以匹配的點,這樣就可以把盡量多的點連起來。

具體代碼如下:

 1 bool find(ll x)
 2 {
 3     for(int i=1; i<=numb; i++)//遍歷所有另一集合中的點
 4     {
 5         if(vis[i] == 0 and mp[x][i])//如果另一集合中的點沒被遍歷過,並且兩個點之間可以匹配
6 { 7 vis[i] = 1;//標記 8 if(pri[i] == 0 || find(pri[i]))//如果目標匹配點沒有進行匹配,或者已經匹配的點可以換其他點匹配 9 { 10 pri[i] = x; 11 return true; 12 } 13 } 14 } 15 return false; 16 }

註意在主函數中遍歷集合中的元素每次在find下一個元素前要把vis數組清零。

例題:高維宇宙,矩陣遊戲

二分圖——匈牙利算法簡述