二分圖匹配,匈牙利算法原理與實現(xiàn)

1 婚戀市場咆耿,明碼實價

中國如今男女比例嚴(yán)重失衡德谅,2021年預(yù)計將有9200萬單身貴族爹橱。為了幫助解決這個社會性問題萨螺,提升整體人民的幸福感,小K打算投身到這份偉大的事業(yè)中愧驱。
幾何思維”婚戀所慰技,用最科學(xué)的方法,幫你脫單组砚。通過概率論尋找最佳匹配對象吻商,再通過微積分精確計算好感上升曲線,最后用數(shù)值分析無限逼近對方的理想型糟红。最可怕的是艾帐,還包郵呢親乌叶,關(guān)注一波了解一下?

上班第一天柒爸,老板給了小K一份單身男女好感的數(shù)據(jù)資料准浴。如下圖,連線表示雙方互有好感捎稚,可以嘗試處對象乐横。

image

突然遇到了一個問題,那怎么才能進行最大的匹配今野,創(chuàng)造整體人民最大的幸福感呢葡公,當(dāng)然也可以順便拿最多的中介費啦。

2 不要慫条霜,就是干

很多時候不是你比別人差催什,而是你執(zhí)行力不夠,在猶豫中喪失機會宰睡。
大家就先行動起來吧蛆楞。

快看,男1號選手在小K的鼓勵(慫恿)下夹厌,率先對女1號發(fā)起了進攻豹爹。在離失敗只有0.01公分的時候,他竟然奇跡般的完成反殺矛纹,沒錯臂聋,他成功啦,這種高超的技巧或南,嫻熟的手法簡直如同教科書一般孩等,值得在座的每個同學(xué)深入研究反復(fù)琢磨啊。

image

男2號選手也不甘落后采够,也對女2號選手發(fā)起了進攻肄方,沒錯,又一次成功啦蹬癌。

image

男3號選手:我勒個去权她,我上我也行啊。于是也對自己心動的女1號發(fā)起了進攻逝薪,毫無意外隅要,他陣亡了。董济。步清。

image

中間彩蛋。

image

男3號不甘心,原地復(fù)活廓啊,想再戰(zhàn)一回欢搜。在一個地方跌倒,咱們就換一個地方再跌谴轮。狂巢。。
于是對女2號發(fā)起了進攻书聚。

image

幾經(jīng)波折唧领。

image

男3號終于也成為了有牽絆的男人,不論未來有多久雌续,只在乎曾經(jīng)擁有過斩个。

image

男4一看:這也沒我啥事兒了啊。

以上的過程其實就是經(jīng)典的匈牙利算法驯杜,求解二分圖的最大匹配問題受啥。

3 匈牙利算法

二分圖
定義:設(shè)G=(V,E)是一個無向圖,頂點集V可分割為兩個互不相交的子集X鸽心,Y滚局,并且圖中每條邊關(guān)聯(lián)的兩個頂點都分屬于這兩個互不相交的子集,兩個子集內(nèi)的頂點不相鄰顽频。

image

判斷是否為二分圖的充要條件:G至少有兩個頂點,且其所有回路的長度均為偶數(shù)藤肢。
判斷方法:染色法

  • 開始對任意一未染色的頂點染色
  • 判斷其相鄰的頂點中,若未染色則將其染上和相鄰頂點不同的顏色糯景;
  • 若已經(jīng)染色且顏色和相鄰頂點的顏色相同則說明不是二分圖嘁圈,若顏色不同則繼續(xù)判斷

可用bfs或者dfs。

image

匹配
在二分圖G的子圖M中蟀淮,M的邊集E中的任意兩條邊都不依附于同一個頂點最住,則稱M是一個匹配

image

飽和點
匹配M的邊集所關(guān)聯(lián)的點為飽和點怠惶,否則為非飽和點涨缚。如上圖:

  • M1M1 的飽和點:X1,X3,X4,Y1,Y2,Y3X1,X3,X4,Y1,Y2,Y3。
  • M2M2的飽和點:X1,X2,Y1,Y3X1,X2,Y1,Y3策治。

交錯路
定義:圖G的一條路徑脓魏,且路徑中的邊在屬于M和不屬于M中交替出現(xiàn)。

image

增廣路(非網(wǎng)絡(luò)流中的定義)
定義:一條交錯路览妖,且該交錯路的起點和終點都為匹配M的非飽和點轧拄。
如上圖,交錯路1是增廣路讽膏;交錯路2不是增廣路,因為終點 X1 不是非飽和點拄丰。

由增廣路推出以下結(jié)論:

  • 路徑的邊數(shù)為奇數(shù)府树,第一條邊和最后一條邊都不屬于M
  • 將路徑中的邊的匹配方式取反操作俐末,會得到更大的匹配M',匹配數(shù)加1
  • M為圖G的最大匹配等價于不存在M的增廣路
image

匈牙利算法核心思想:

  • 1.初始匹配M為空
  • 2.找出一條增廣路徑p奄侠,取反操作得到更大的匹配M'代替M
  • 3.重復(fù)步驟2卓箫,直到找不出增廣路為止

4 代碼實現(xiàn)

變量定義及初始化

const int MAXM = 200, MAXN = 200;
bool map[MAXN][MAXM] = {false}, visit[MAXM];
int n, m, x[MAXM], y[MAXN], ans = 0;

初始化

void init() {
    memset(x, 0xff, MAXM * 4);
    memset(y, 0xff, MAXN * 4);
    memset(map, false, MAXN * MAXM);

    int num, temp;
    cin >> n >> m;
    for (int i = 0; i < n; ++i) {
        cin >> num;
        for (int j = 0; j < num; ++j) {
            cin >> temp;
            map[i][temp - 1] = true;
        }
    }
}

遞歸尋找增廣路

bool hungary(int u) {
    for (int i = 0; i < m; ++i) {
        if (!visit[i] && map[u][i]) {
            visit[i] = true;
            if (y[i] == -1 || hungary(y[i])) {
                x[u] = i;
                y[i] = u;
                return true;
            }
        }
    }
    return false;
}

遍歷所有點

int main() {
    init();
    for (int i = 0; i < n; ++i) {
        if (x[i] == -1) {
            memset(visit, false, MAXM);
            if (hungary(i)) {
                ans++;
            }
        }
    }
    cout << ans << endl;

    return 0;
}

測試數(shù)據(jù)

輸入
5 5
2 2 5
3 2 3 4
2 1 5
3 1 2 5
1 2
輸出
4

作者:幾何思維
原文鏈接:https://www.cnblogs.com/kylewilson/p/14517884.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市垄潮,隨后出現(xiàn)的幾起案子烹卒,更是在濱河造成了極大的恐慌,老刑警劉巖弯洗,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旅急,死亡現(xiàn)場離奇詭異,居然都是意外死亡牡整,警方通過查閱死者的電腦和手機藐吮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逃贝,“玉大人谣辞,你說我怎么就攤上這事°灏猓” “怎么了泥从?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沪摄。 經(jīng)常有香客問我歉闰,道長,這世上最難降的妖魔是什么卓起? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任和敬,我火速辦了婚禮,結(jié)果婚禮上戏阅,老公的妹妹穿的比我還像新娘昼弟。我一直安慰自己,他們只是感情好奕筐,可當(dāng)我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布舱痘。 她就那樣靜靜地躺著,像睡著了一般离赫。 火紅的嫁衣襯著肌膚如雪芭逝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天渊胸,我揣著相機與錄音旬盯,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛胖翰,可吹牛的內(nèi)容都是我干的接剩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼萨咳,長吁一口氣:“原來是場噩夢啊……” “哼懊缺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起培他,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鹃两,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后舀凛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俊扳,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年腾降,在試婚紗的時候發(fā)現(xiàn)自己被綠了拣度。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡螃壤,死狀恐怖抗果,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奸晴,我是刑警寧澤冤馏,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站寄啼,受9級特大地震影響逮光,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜墩划,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一涕刚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乙帮,春花似錦杜漠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至氢卡,卻和暖如春锈至,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背译秦。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工峡捡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留击碗,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓棋返,卻偏偏與公主長得像延都,于是被迫代替她去往敵國和親雷猪。 傳聞我的和親對象是個殘疾皇子睛竣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,974評論 2 355

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