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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[SinGuLaRiTy] KM算法

發(fā)布時(shí)間:2024/8/26 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [SinGuLaRiTy] KM算法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【SinGuLaRiTy-1018】 Copyright (c) SinGuLaRiTy 2017. All Rights Reserved.

Some Method Are Reproduced From?evasiu。

KM算法的基本步驟

(1) 初始化可行標(biāo)桿?
(2) 用匈牙利算法尋找完備匹配?
(3) 若未找到完備匹配則修改可行標(biāo)桿?
(4) 重復(fù)(2)(3)直到找到相等子圖的完備匹配?

相關(guān)概念

◎KM算法是用于尋找?guī)?quán)二分圖最佳匹配的算法。?
◎二分圖是這樣一種圖:所有頂點(diǎn)可以分成兩個(gè)集:X和Y,其中X和Y中的任意兩個(gè)在同一個(gè)集中的點(diǎn)都不相連,而來(lái)自X集的頂點(diǎn)與來(lái)自Y集的頂點(diǎn)有連線。當(dāng)這些連線被賦于一定的權(quán)重時(shí),這樣的二分圖便是帶權(quán)二分圖。?
◎二分圖匹配是指求出一組邊,其中的頂點(diǎn)分別在兩個(gè)集合中,且任意兩條邊都沒(méi)有相同的頂點(diǎn),這組邊叫做二分圖的匹配,而所能得到的最大的邊的個(gè)數(shù),叫做二分圖的最大匹配。?
<Tip> 我們也可以換個(gè)角度看二分圖的最大匹配,即二分圖的每條邊的默認(rèn)權(quán)重為1,我們求到的二分圖的最大匹配的權(quán)重最大。對(duì)于帶權(quán)二分圖,其邊有大于0的權(quán)重,找到一組匹配,使其權(quán)重最大,即為帶權(quán)二分圖的最佳匹配。?

匈牙利算法

匈牙利算法一般用于尋找二分圖的最大匹配。算法根據(jù)一定的規(guī)則選擇二分圖的邊加入匹配子圖中,其基本模式為:?

◎初始化匹配子圖為空?
◎while 找得到增廣路徑?
? ?do 把增廣路徑添加到匹配子圖中?

增廣路徑

增廣路徑的特性

◎有奇數(shù)條邊?
◎起點(diǎn)在二分圖的X邊,終點(diǎn)在二分圖的Y邊?
◎?路徑上的點(diǎn)一定是一個(gè)在X邊,一個(gè)在Y邊,交錯(cuò)出現(xiàn)
◎整條路徑上沒(méi)有重復(fù)的點(diǎn)?
◎?起點(diǎn)和終點(diǎn)都是目前還沒(méi)有配對(duì)的點(diǎn),其他的點(diǎn)都已經(jīng)出現(xiàn)在匹配子圖中?
◎路徑上的所有第奇數(shù)條邊都是目前還沒(méi)有進(jìn)入目前的匹配子圖的邊,而所有第偶數(shù)條邊都已經(jīng)進(jìn)入目前的匹配子圖。奇數(shù)邊比偶數(shù)邊多一條邊?
◎于是當(dāng)我們把所有第奇數(shù)條邊都加到匹配子圖并把條偶數(shù)條邊都刪除,匹配數(shù)增加了1

實(shí)現(xiàn)過(guò)程

例如下圖,藍(lán)色的是當(dāng)前的匹配子圖,目前只有邊x0y0,然后通過(guò)x1找到了增廣路徑:x1y0->y0x0->x0y2?

?

其中第奇數(shù)第邊x1y0和x0y2不在當(dāng)前的匹配子圖中,而第偶數(shù)條邊x0y0在匹配子圖中,通過(guò)添加x1y0和x0y2到匹配子圖并刪除x0y0,使得匹配數(shù)由1增加到了2。每找到一條增廣路徑,通過(guò)添加刪除邊,我們總是能使匹配數(shù)加1.?

增廣路徑有兩種尋徑方法,一個(gè)是DFS,一個(gè)是BFS。例如從x2出發(fā)尋找增廣路徑,如果是深搜,x2找到y(tǒng)0匹配,但發(fā)現(xiàn)y0已經(jīng)被x1匹配了,于是就深入到x1,去為x1找新的匹配節(jié)點(diǎn),結(jié)果發(fā)現(xiàn)x1沒(méi)有其他的匹配節(jié)點(diǎn),于是匹配失敗,x2接著找y1,發(fā)現(xiàn)y1可以匹配,于是就找到了新的增廣路徑。如果是寬搜,x1找到y(tǒng)0節(jié)點(diǎn)的時(shí)候,由于不能馬上得到一個(gè)合法的匹配,于是將它做為候選項(xiàng)放入隊(duì)列中,并接著找y1,由于y1已經(jīng)匹配,于是匹配成功返回了。相對(duì)來(lái)說(shuō),深搜要容易理解些,其棧可以由遞歸過(guò)程來(lái)維護(hù),而寬搜則需要自己維護(hù)一個(gè)隊(duì)列,并對(duì)一路過(guò)來(lái)的路線自己做標(biāo)記,實(shí)現(xiàn)起來(lái)比較麻煩。?

對(duì)于帶權(quán)重的二分圖來(lái)說(shuō),我們可以把它看成一個(gè)所有X集合的頂點(diǎn)到所有Y集合的頂點(diǎn)均有邊的二分圖(把原來(lái)沒(méi)有的邊添加入二分圖,權(quán)重為0即可),也就是說(shuō)它必定存在完備匹配(即其匹配數(shù)為min(|X|,|Y|))。為了使權(quán)重達(dá)到最大,我們實(shí)際上是通過(guò)貪心算法來(lái)選邊,形成一個(gè)新的二分圖(我們下面叫它二分子圖好了),并在該二分圖的基礎(chǔ)上尋找最大匹配,當(dāng)該最大匹配為完備匹配時(shí),我們可以確定該匹配為最佳匹配。(在這里我們?nèi)绱硕x最大匹配:匹配邊數(shù)最多的匹配和最佳匹配:匹配邊的權(quán)重和最大的匹配。)?

貪心算法總是將最優(yōu)的邊優(yōu)先加入二分子圖,該最優(yōu)的邊將對(duì)當(dāng)前的匹配子圖帶來(lái)最大的貢獻(xiàn),貢獻(xiàn)的衡量是通過(guò)標(biāo)桿來(lái)實(shí)現(xiàn)的。下面我們將通過(guò)一個(gè)實(shí)例來(lái)解釋這個(gè)過(guò)程。?

有帶權(quán)二分圖:?
?
算法把權(quán)重轉(zhuǎn)換成標(biāo)桿,X集跟Y集的每個(gè)頂點(diǎn)各有一個(gè)標(biāo)桿值,初始情況下權(quán)重全部放在X集上。由于每個(gè)頂點(diǎn)都將至少會(huì)有一個(gè)匹配點(diǎn),貪心算法必然優(yōu)先選擇該頂點(diǎn)上權(quán)重最大的邊(最理想的情況下,這些邊正好沒(méi)有交點(diǎn),于是我們自然得到了最佳匹配)。最初的二分子圖為:(可以看到初始化時(shí)X標(biāo)桿為該頂點(diǎn)上的最大權(quán)重,而Y標(biāo)桿為0)?

?
從X0找增廣路徑,找到X0Y4;從X1找不到增廣路徑,也就是說(shuō),必須往二分子圖里邊添加新的邊,使得X1能找到它的匹配,同時(shí)使權(quán)重總和添加最大。由于X1通往Y4而Y4已經(jīng)被X0匹配,所以有兩種可能,一個(gè)是為X0找一個(gè)新的匹配點(diǎn)并把Y4讓給X1,或者是為X1找一個(gè)新的匹配點(diǎn),現(xiàn)在我們將要看到標(biāo)桿的作用了。根據(jù)傳統(tǒng)的算法描述,能夠進(jìn)入二分子圖的邊的條件為L(zhǎng)(x)+L(y)>=weight(xy)。當(dāng)找不到增廣路徑時(shí),對(duì)于搜索過(guò)的路徑上的XY點(diǎn),設(shè)該路徑上的X頂點(diǎn)集為S,Y頂點(diǎn)集為T(mén),對(duì)所有在S中的點(diǎn)xi及不在T中的點(diǎn)yj,計(jì)算d=min{(L(xi)+L(yj)-weight(xiyj))},從S集中的X標(biāo)桿中減去d,并將其加入到T集中的Y的標(biāo)桿中,由于S集中的X標(biāo)桿減少了,而不在T中的Y標(biāo)桿不變,相當(dāng)于這兩個(gè)集合中的L(x)+L(y)變小了,也就是,有新的邊可以加入二分子圖了。從貪心選邊的角度看,我們可以為X0選擇新的邊而拋棄原先的二分子圖中的匹配邊,也可以為X1選擇新的邊而拋棄原先的二分子圖中的匹配邊,因?yàn)槲覀儾荒芡瑫r(shí)選擇X0Y4和X1Y4,因?yàn)檫@是一個(gè)不合法匹配,這個(gè)時(shí)候,d=min{(L(xi)+L(yj)-weight(xiyj))}的意義就在于,我們選擇一條新的邊,這條邊將被加入匹配子圖中使得匹配合法,選擇這條邊形成的匹配子圖,將比原先的匹配子圖加上這條非法邊組成的非法匹配子圖的權(quán)重和(如果它是合法的,它將是最大的)小最少,即權(quán)重最大了。好繞口的。用數(shù)學(xué)的方式表達(dá),設(shè)原先的不合法匹配(它的權(quán)重最大,因?yàn)槲覀兛偸菑臋?quán)重最大的邊找起的)的權(quán)重為W,新的合法匹配為W’,d為min{W-W’i}。在這個(gè)例子中,S={X0, X1},Y={Y4},求出最小值d=L(X1)+L(Y0)-weight(X1Y0)=2,得到新的二分子圖:?

?
重新為X1尋找增廣路徑,找到X1Y0,可以看到新的匹配子圖的權(quán)重為9+6=15,比原先的不合法的匹配的權(quán)重9+8=17正好少d=2。?
接下來(lái)從X2出發(fā)找不到增廣路徑,其走過(guò)的路徑如藍(lán)色的路線所示。形成的非法匹配子圖:X0Y4,X1Y0及X2Y0的權(quán)重和為22。在這條路徑上,只要為S={X0,X1,X2}中的任意一個(gè)頂點(diǎn)找到新的匹配,就可以解決這個(gè)問(wèn)題,于是又開(kāi)始求d。?
d=L(X0)+L(Y2)-weight(X0Y2)=L(X2)+L(Y1)-weight(X2Y1)=1.?


新的二分子圖為:?
?

重新為X2尋找增廣路徑,如果我們使用的是深搜,會(huì)得到路徑:X2Y0->Y0X1->X1Y4->Y4X0->X0Y2,即奇數(shù)條邊而刪除偶數(shù)條邊,新的匹配子圖中由這幾個(gè)頂點(diǎn)得到的新的權(quán)重為21;如果使用的是寬搜,會(huì)得到路徑X2Y1,另上原先的兩條匹配邊,權(quán)重為21。假設(shè)我們使用的是寬搜,得到的新的匹配子圖為:?

?
接下來(lái)依次類(lèi)推,直到為X4找到一個(gè)匹配點(diǎn)。?

KM算法的最大特點(diǎn)在于利用標(biāo)桿和權(quán)重來(lái)生成一個(gè)二分子圖,在該二分子圖上面找最大匹配,而且,當(dāng)些僅當(dāng)找到完備匹配,才能得到最佳匹配。標(biāo)桿和權(quán)重的作用在于限制新邊的加入,使得加入的新邊總是能為子圖添加匹配數(shù),同時(shí)又令權(quán)重和得到最大的提高。

實(shí)現(xiàn)代碼

/*HDU-2255*/ #include<cstdio> #include<algorithm> #include<cstring> #include<iostream>#define MAXN 310 #define INF 0x3f3f3f3fusing namespace std;int nx,ny; int g[MAXN][MAXN]; int linker[MAXN],linkx[MAXN],linky[MAXN]; int slack[MAXN]; bool visx[MAXN],visy[MAXN];bool dfs(int k) {visx[k]=true;for(int y=0;y<ny;y++){if(visy[y])continue;int tmp=linkx[k]+linky[y]-g[k][y];if(!tmp){visy[y]=true;if(linker[y]==-1||dfs(linker[y])){linker[y]=k;return true;}}else if(slack[y]>tmp)slack[y]=tmp;}return false; } int KM() {memset(linker,-1,sizeof(linker));memset(linky,0,sizeof(linky));memset(linkx,-INF,sizeof(linkx));for(int i=0;i<nx;i++){for(int j=0;j<ny;j++){if(g[i][j]>linkx[i])linkx[i]=g[i][j];}}for(int x=0;x<nx;x++){for(int i=0;i<ny;i++)slack[i]=INF;while(true){memset(visx,false,sizeof(visx));memset(visy,false,sizeof(visy));if(dfs(x)==true)break;int d=INF;for(int i=0;i<ny;i++)if(!visy[i]&&d>slack[i])d=slack[i];for(int i=0;i<nx;i++){if(visx[i])linkx[i]-=d;}for(int i=0;i<ny;i++){if(visy[i])linky[i]+=d;elseslack[i]-=d;}}}int res=0;for(int i=0;i<ny;i++)if(linker[i]!=-1)res+=g[linker[i]][i];return res; }int main() {int n;while(scanf("%d",&n)!=EOF){for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf("%d",&g[i][j]);nx=ny=n;printf("%d\n",KM());}return 0; }

?

Time: 2017-07-05

轉(zhuǎn)載于:https://www.cnblogs.com/SinGuLaRiTy2001/p/7123056.html

總結(jié)

以上是生活随笔為你收集整理的[SinGuLaRiTy] KM算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91华人在线 | 丁香花电影免费播放电影 | 亚洲黄色片子 | wwww日本60 | 天天躁夜夜躁狠狠躁 | 欧美亚洲不卡 | 久久综合伊人77777麻豆最新章节 | 亚洲无人区码一码二码三码 | 精品动漫一区二区三区在线观看 | 懂色av,蜜臀av粉嫩av | 2022精品国偷自产免费观看 | www色中色 | 自拍亚洲欧美 | 久久久久久五月天 | 欧美色插 | 亚洲在线免费观看视频 | 青草视频在线 | 69re视频 | 精品国产精品网麻豆系列 | 日本在线成人 | 国产精品不卡av | 色久av| 国内自拍小视频 | 黄片一区二区 | 五月激情五月婷婷 | 三女警花合力承欢猎艳都市h | www香蕉| 在线免费观看成年人视频 | 久久久精品91 | 成人无码久久久久毛片 | 天天操天天干天天操 | 日日综合网 | 成人首页| av大片免费在线观看 | 岛国av噜噜噜久久久狠狠av | 日韩一区二区中文字幕 | 丰满少妇高潮一区二区 | 亚洲码国产精品高潮在线 | 国产又色又爽无遮挡免费 | 看片一区二区 | 黄色一级在线观看 | 国产综合无码一区二区色蜜蜜 | 变态 另类 国产 亚洲 | 久久香蕉影视 | 国产xxxx在线观看 | 无码人妻精品一区二区三区夜夜嗨 | 96av在线视频 | 高清欧美性猛交xxxx | 黄页网站在线 | a级片免费看 | 婷婷色亚洲 | 天堂色区 | 日韩久久影视 | 免费看a级黄色片 | 亚洲色成人一区二区三区小说 | av激情小说 | 日日干夜夜骑 | 91网视频| 91精品在线视频观看 | 亚洲精品91 | 进去里视频在线观看 | www.波多野结衣.com | 人妻熟人中文字幕一区二区 | 久国久产久精永久网页 | 九九热在线视频观看 | 拍摄av现场失控高潮数次 | 国产一区成人 | 美女毛片 | 日韩成人在线影院 | 人妻一区二区三区 | 人人射人人干 | jizz中国少妇 | 国产日韩一区二区在线 | 久久99在线 | 东京热一区二区三区四区 | 精品动漫一区 | 麻豆亚洲av成人无码久久精品 | 小少妇哺乳喂奶播放 | 国产精品一区二区三区四区五区 | 女教师痴汉调教hd中字 | 久久久久久av无码免费网站下载 | 亚洲素人 | 亚洲电影中文字幕 | 免费视频网站在线观看入口 | 日韩专区欧美专区 | 日日夜夜国产精品 | 老司机深夜免费福利 | 日本暧暧视频 | 国产91成人 | 亚洲春色一区二区三区 | 国内久久久| 新呦u视频一区二区 | 日韩欧美色图 | 青青草社区视频 | 午夜精品久久久久久99热 | 国产精品久久精品 | 久久性感美女视频 | 久久中文字幕电影 | 国产日韩片 |