匈牙利演算法 二分圖最大匹配題模板

來源:互聯網
上載者:User

標籤:二分圖最大匹配   ret   i++   ==   輸入   國際   eof   nbsp   memset   

【任務】

給定一個二分圖,用匈牙利演算法求這個二分圖的最大匹配數。

【說明】

求最大匹配,那麼我們希望每一個在左邊的點都盡量找到右邊的一個點和它匹配。

我們一次枚舉左邊的點x的所有出邊指向的點y,

若y之前沒有被匹配,那麼(x,y)就是一對合法的匹配,我們將匹配數加一,

否則我們試圖給原來匹配的y和x‘重新找一個匹配,如果x‘匹配成功,那麼(x,y)就可以新增為一對合法的匹配。

給x‘尋找匹配的過程可以遞迴解決。

【介面】

int hungary();

複雜度O(|E|*sqrt(|V|))

輸入: n    全域變數,左側的點數

      g    全域變數,g[i]表示與左邊點i相連的右邊的點

輸出:tot     最大匹配數

   from    全域變數,from[i]表示最大匹配圖中與左邊點i相連的邊 

 

 

【代碼】

//輸入:const  int MAXN = 555; // 數組長度int n = 200; //n表示左側的點數vector <int> g[MAXN];  // 表示與左邊點i相連的右邊點//輸出:int from[MAXN];//表示最大匹配中與左邊點i相連的邊int tot;  // 二分圖最大匹配數bool use[MAXN]; // 左邊點的使用標記//匈牙利演算法 模板題 ,match和hungary見小紅書ACM國際大學生程式設計競賽 演算法與實現bool match(int x){    for(int i = 0;i < g[x].size(); ++i){        if(!use[g[x][i]]){            use[g[x][i]] = true;            if(from[g[x][i]] == -1 || match(from[g[x][i]])){                from[g[x][i]] = x;                return true;            }        }    }    return false;}int hungary(){    tot = 0;    memset(from,255,sizeof(from));    for(int i = 1;i <= n; i++){        memset(use,0,sizeof(use));        if(match(i)) ++tot;    }    return tot;}

 

這個我打算寫給自己寫題學習時用的,發出來供大家參考。

匈牙利演算法 二分圖最大匹配題模板

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.