日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hihocoder 1122 : 二分图二•二分图最大匹配之匈牙利算法

發布時間:2025/3/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hihocoder 1122 : 二分图二•二分图最大匹配之匈牙利算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先,匈牙利算法是用來求二分圖的最大匹配的,它的核心問題就是找增廣路徑。匈牙利算法的時間復雜度為O(VE),其中

V為二分圖左邊的頂點數,E為二分圖中邊的數目。


現在我們來看看增廣路有哪些性質:


(1)有奇數條邊。

(2)起點在二分圖的左半邊,終點在右半邊。

(3)路徑上的點一定是一個在左半邊,一個在右半邊,交替出現。

(4)整條路徑上沒有重復的點。

(5)起點和終點都是目前還沒有配對的點,而其它所有點都是已經配好對的。

(6)路徑上的所有第奇數條邊都不在原匹配中,所有第偶數條邊都出現在原匹配中。

(7)最后,也是最重要的一條,把增廣路徑上的所有第奇數條邊加入到原匹配中去,并把增廣路徑中的所有第偶數條邊從原

匹配中刪除(這個操作稱為增廣路徑的取反),則新的匹配數就比原匹配數增加了1個。


當然,匹配開始時我們任意選擇一邊的所有點為起始點找增廣路徑,由增廣路的性質可以看出,每找到一條增廣路徑,匹配

數增加1。


求增廣路的方法是用遞歸的思想,從已知的匹配結果當中去尋找是否還能夠給當前節點留出一個位置來匹配。。。。


#include<iostream> #include<cstdio> #include<cstring> using namespace std;const int maxn = 1001; int n,m,belong[maxn]; bool line[maxn][maxn],vis[maxn];bool find(int x) {for(int j = 1; j <= n; j++){if(line[x][j] == true && vis[j] == false){vis[j] = true;if(belong[j] == 0 || find(belong[j]) == true){belong[j] = x;return true;}}}return false; }int main() { while(scanf("%d%d",&n,&m)!=EOF){for(int i = 1; i <= m; i++){int u,v;scanf("%d%d",&u,&v);line[u][v] = line[v][u] = true;}int ans = 0;memset(belong,0,sizeof(belong));for(int i = 1; i <= n; i++){memset(vis,false,sizeof(vis));if(find(i)) ans++;}printf("%d\n",ans/2); //由于是對每個節點都進行了一次匹配,所以最后的結果要除以2。。}return 0; }

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的hihocoder 1122 : 二分图二•二分图最大匹配之匈牙利算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。