KM演算法 帶權二分匹配 O n 3

2022-07-18 08:48:13 字數 1271 閱讀 2638

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

const ll maxn = 550

;const ll inf = 1000000009

;ll n, m, e;

ll love[maxn][maxn];

//記錄每個妹子和每個男生的好感度

ll ex_girl[maxn]; //

每個妹子的期望值

ll ex_boy[maxn]; //

每個男生的期望值

bool vis_girl[maxn]; //

記錄每一輪匹配匹配過的女生

bool vis_boy[maxn]; //

記錄每一輪匹配匹配過的男生

ll match[maxn]; //

記錄每個男生匹配到的妹子 如果沒有則為-1

ll slack[maxn]; //

記錄每個漢子如果能被妹子傾心最少還需要多少期望值

bool dfs(int

girl)

}else

}return

false;}

ll km()

}//嘗試為每乙個女生解決歸宿問題

for (int i = 0; i < n; ++i)

for (int j = 0; j < n; ++j)

for (int j = 0; j < m; j++)}}

//匹配完成 求出所有配對的好感度的和

ll res = 0, cnt = 0

;

for (int i = 0; i < m; ++i)

}if (cnt != n)return -1

;

return

res;

}int

main()

cout

<< "

case

"<< cas++ << ": "

; cout

<< km() <}

return0;

}

二分匹配演算法

匈牙利演算法求二分匹配 下 include includeusing namespace std int v 頂點數 vectorg max v 圖的鄰接表表示 int match max v 所匹配的頂點 bool used max v dfs 中用到的訪問標記 向圖中增加一條連線 u 和 v 的...

求最大權二分匹配的KM演算法

最大權二分匹配問題就是給二分圖的每條邊乙個權值,選擇若干不相交的邊,得到的總權值最大。解決這個問題可以用km演算法。理解km演算法需要首先理解 可行頂標 的概念。可行頂標是指關於二分圖兩邊的每個點的乙個值lx i 或ly j 保證對於每條邊w i j 都有lx i ly j w i j 0。如果所有...

二分匹配 匈牙利演算法

這個演算法真心很精妙,其實 很簡單,但是理解其中的奧秘還真要花點時間 matrix67大牛說的好 說穿了,就是你從二分圖中找出一條路徑來,讓路徑的起點和終點都是還沒有匹配過的點,並且路徑經過的連線是一條沒被匹配 一條已經匹配過,再下一條又沒匹配這樣交替地出現。找到這樣的路徑後,顯然路徑裡沒被匹配的連...