KM算法

KM算法用來(lái)求二分圖最大權(quán)完美匹配舟山。
轉(zhuǎn)載網(wǎng)址:[http://www.cnblogs.com/wenruo/p/5264235.html]

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 305;
const int INF = 0x3f3f3f3f;
int love[MAXN][MAXN];   // 記錄每個(gè)妹子和每個(gè)男生的好感度
int ex_girl[MAXN];      // 每個(gè)妹子的期望值
int ex_boy[MAXN];       // 每個(gè)男生的期望值
bool vis_girl[MAXN];    // 記錄每一輪匹配匹配過(guò)的女生
bool vis_boy[MAXN];     // 記錄每一輪匹配匹配過(guò)的男生
int match[MAXN];        // 記錄每個(gè)男生匹配到的妹子 如果沒(méi)有則為-1
int slack[MAXN];        // 記錄每個(gè)漢子如果能被妹子傾心最少還需要多少期望值
int N;
bool dfs(int girl)
{
    vis_girl[girl] = true;

    for (int boy = 0; boy < N; ++boy) {

        if (vis_boy[boy]) continue; // 每一輪匹配 每個(gè)男生只嘗試一次

        int gap = ex_girl[girl] + ex_boy[boy] - love[girl][boy];

        if (gap == 0) {  // 如果符合要求
            vis_boy[boy] = true;
            if (match[boy] == -1 || dfs( match[boy] )) {    // 找到一個(gè)沒(méi)有匹配的男生 或者該男生的妹子可以找到其他人
                match[boy] = girl;
                return true;
            }
        } else {
            slack[boy] = min(slack[boy], gap);  // slack 可以理解為該男生要得到女生的傾心 還需多少期望值 取最小值 備胎的樣子【捂臉
        }
    }

    return false;
}
int KM()
{
    memset(match, -1, sizeof match);    // 初始每個(gè)男生都沒(méi)有匹配的女生
    memset(ex_boy, 0, sizeof ex_boy);   // 初始每個(gè)男生的期望值為0

    // 每個(gè)女生的初始期望值是與她相連的男生最大的好感度
    for (int i = 0; i < N; ++i) {
        ex_girl[i] = love[i][0];
        for (int j = 1; j < N; ++j) {
            ex_girl[i] = max(ex_girl[i], love[i][j]);
        }
    }

    // 嘗試為每一個(gè)女生解決歸宿問(wèn)題
    for (int i = 0; i < N; ++i) {

        fill(slack, slack + N, INF);    // 因?yàn)橐∽钚≈?初始化為無(wú)窮大

        while (1) {
            // 為每個(gè)女生解決歸宿問(wèn)題的方法是 :如果找不到就降低期望值,直到找到為止

            // 記錄每輪匹配中男生女生是否被嘗試匹配過(guò)
            memset(vis_girl, false, sizeof vis_girl);
            memset(vis_boy, false, sizeof vis_boy);

            if (dfs(i)) break;  // 找到歸宿 退出

            // 如果不能找到 就降低期望值
            // 最小可降低的期望值
            int d = INF;
            for (int j = 0; j < N; ++j)
                if (!vis_boy[j]) d = min(d, slack[j]);

            for (int j = 0; j < N; ++j) {
                // 所有訪問(wèn)過(guò)的女生降低期望值
                if (vis_girl[j]) ex_girl[j] -= d;

                // 所有訪問(wèn)過(guò)的男生增加期望值
                if (vis_boy[j]) ex_boy[j] += d;
                // 沒(méi)有訪問(wèn)過(guò)的boy 因?yàn)間irl們的期望值降低吊档,距離得到女生傾心又進(jìn)了一步秒拔!
                else slack[j] -= d;
            }
        }
    }

    // 匹配完成 求出所有配對(duì)的好感度的和
    int res = 0;
    for (int i = 0; i < N; ++i)
        res += love[ match[i] ][i];

    return res;
}

int main()
{
    while (~scanf("%d", &N)) {

        for (int i = 0; i < N; ++i)
            for (int j = 0; j < N; ++j)
                scanf("%d", &love[i][j]);

        printf("%d\n", KM());
    }
    return 0;
}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末穷娱,一起剝皮案震驚了整個(gè)濱河市谷市,隨后出現(xiàn)的幾起案子亡嫌,更是在濱河造成了極大的恐慌嚎于,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挟冠,死亡現(xiàn)場(chǎng)離奇詭異于购,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)知染,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)肋僧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人控淡,你說(shuō)我怎么就攤上這事嫌吠。” “怎么了掺炭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵辫诅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我涧狮,道長(zhǎng)炕矮,這世上最難降的妖魔是什么么夫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮肤视,結(jié)果婚禮上档痪,老公的妹妹穿的比我還像新娘。我一直安慰自己邢滑,他們只是感情好腐螟,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著困后,像睡著了一般遭垛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上操灿,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天锯仪,我揣著相機(jī)與錄音喂链,去河邊找鬼连舍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛揍庄,可吹牛的內(nèi)容都是我干的救鲤。 我是一名探鬼主播久窟,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼本缠!你這毒婦竟也來(lái)了斥扛?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤丹锹,失蹤者是張志新(化名)和其女友劉穎稀颁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體楣黍,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匾灶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了租漂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阶女。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哩治,靈堂內(nèi)的尸體忽然破棺而出秃踩,到底是詐尸還是另有隱情,我是刑警寧澤业筏,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布憔杨,位于F島的核電站,受9級(jí)特大地震影響驾孔,放射性物質(zhì)發(fā)生泄漏芍秆。R本人自食惡果不足惜惯疙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妖啥。 院中可真熱鬧霉颠,春花似錦、人聲如沸荆虱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)怀读。三九已至诉位,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間菜枷,已是汗流浹背苍糠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留啤誊,地道東北人岳瞭。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蚊锹,于是被迫代替她去往敵國(guó)和親瞳筏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 萌萌的講解以下為部分摘取最大二分匹配:在一個(gè)二分圖中找到P->q的一個(gè)匹配方案牡昆,使得匹配中的邊數(shù)量不小于任何其他的...
    Gitfan閱讀 3,235評(píng)論 1 0
  • A - 奔小康賺大錢(qián)題意:求解二分圖的最優(yōu)匹配 B - Going Home題意:給你一個(gè)N行M列的矩陣姚炕,其中“....
    Gitfan閱讀 3,263評(píng)論 0 0
  • G - Cyclic Tour題意:圖中有n個(gè)點(diǎn)和m條有向邊現(xiàn)在要將該圖分成若干環(huán),每個(gè)環(huán)中至少有兩個(gè)點(diǎn)丢烘。環(huán)與環(huán)不...
    Gitfan閱讀 785評(píng)論 0 1
  • 一部很有趣的電影柱宦,安利安利∏π《返老還童》向我們講述了本杰明一生的奇特故事捷沸,劇情很是吸引人呢摊沉,分享一下影片中很有意義...
    笑語(yǔ)嫣然閱讀 706評(píng)論 0 5
  • 今天狐史,吳校長(zhǎng)早早就在群里給大家提醒今晚特別的課程,因?yàn)檫@個(gè)課程要講12年说墨,每年有且只有一講骏全,所以這不得不吸引大家的...
    宕昌283康愛(ài)霞閱讀 231評(píng)論 0 1