二分圖匹配 - 匈牙利演算法

來源:互聯網
上載者:User

標籤:教你   多少   工作   eps   long   特殊   部分   detail   blog   

所謂的二分圖 : 就是指相同的部分沒有邊,那麼這個圖就是二分圖。

註:以下轉自 http://blog.csdn.net/dark_scope/article/details/8880547

匈牙利演算法是由匈牙利數學家Edmonds於1965年提出,因而得名。匈牙利演算法是基於Hall定理中充分性證明的思想,它是部圖匹配最常見的演算法,該演算法的核心就是尋找增廣路徑,它是一種用增廣路徑求二分圖最大匹配的演算法。

-------等等,看得頭大?那麼請看下面的版本:

通過數代人的努力,你終於趕上了剩男剩女的大潮,假設你是一位光榮的新世紀媒人,在你的手上有N個剩男,M個剩女,每個人都可能對多名異性有好感(驚訝-_-||暫時不考慮特殊的性取向),如果一對男女互有好感,那麼你就可以把這一對撮合在一起,現在讓我們無視掉所有的單相思(好憂傷的感覺快哭了),你擁有的大概就是下面這樣一張關係圖,每一條連線都表示互有好感。

本著救人一命,勝造七級浮屠的原則,你想要儘可能地撮合更多的情侶,匈牙利演算法的工作模式會教你這樣做:

===============================================================================

一: 先試著給1號男生找妹子,發現第一個和他相連的1號女生還名花無主,got it,連上一條藍線


===============================================================================

二:接著給2號男生找妹子,發現第一個和他相連的2號女生名花無主,got it


===============================================================================

三:接下來是3號男生,很遺憾1號女生已經有主了,怎麼辦呢?

我們試著給之前1號女生匹配的男生(也就是1號男生)另外分配一個妹子。

(黃色表示這條邊被臨時拆掉)

與1號男生相連的第二個女生是2號女生,但是2號女生也有主了,怎麼辦呢?我們再試著給2號女生的原配(發火發火)重新找個妹子(注意這個步驟和上面是一樣的,這是一個遞迴的過程)

此時發現2號男生還能找到3號女生,那麼之前的問題迎刃而解了,回溯回去

2號男生可以找3號妹子~~~                  1號男生可以找2號妹子了~~~                3號男生可以找1號妹子

所以第三步最後的結果就是:


===============================================================================

四: 接下來是4號男生,很遺憾,按照第三步的節奏我們沒法給4號男生騰出來一個妹子,我們實在是無能為力了……香吉士同學走好。

===============================================================================
這就是匈牙利演算法的流程,其中找妹子是個遞迴的過程,最最關鍵的字就是“騰”字

其原則大概是:有機會上,沒機會創造機會也要上

 

HDU 2063

題意 : 這些男女之間互有好感,儘可能的撮合他們到一起,問最多可以撮合多少對 ?

 

代碼:

/* * Author:  ry  * Created Time:  2017/10/31 8:53:47 * File Name: 1.cpp */#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#include <string>#include <vector>#include <stack>#include <queue>#include <set>#include <map>#include <time.h>using namespace std;const int eps = 1e6+5;const double pi = acos(-1.0);const int inf = 0x3f3f3f3f;#define Max(a,b) a>b?a:b#define Min(a,b) a>b?b:a#define ll long longint k, m, n;int edge[505][505];int pt[505];int used[505];bool find(int x){    for(int i = 1; i <= n; i++){        if (edge[x][i] && !used[i]){            used[i] = 1;            if (pt[i] == 0 || find(pt[i])){                pt[i] = x;                return true;            }        }    }    return false;}int main() {    int a, b;        while(~scanf("%d", &k) && k){        scanf("%d%d", &m, &n);        memset(edge, 0, sizeof(edge));        memset(pt, 0, sizeof(pt));        while(k--){            scanf("%d%d", &a, &b);                    edge[a][b] = 1;        }        int ans = 0;        for(int i = 1; i <= m; i++){            memset(used, 0, sizeof(used));            if (find(i)){                ans++;            }        }        printf("%d\n", ans);    }    return 0;}

 

二分圖匹配 - 匈牙利演算法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.