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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

判别两棵树是否相等 设计算法_从匈牙利算法到KM算法

發布時間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 判别两棵树是否相等 设计算法_从匈牙利算法到KM算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

網上搜了好多KM算法的文章,都寫得云里霧里。看了半天之后,我終于看懂了。其實KM算法非常簡單,只要會匈牙利算法了,一下就能看懂KM算法。

如果大家對自己的匈牙利算法不夠自信的話,可以先復習一下,放上我的上一篇文章。

https://zhuanlan.zhihu.com/p/208596378?zhuanlan.zhihu.com

KM算法是解決什么問題的?

要知道,最大匹配不是唯一的,不同的人用匈牙利算法,可能找到不同的匹配結果。那么怎么評估這些不同的匹配呢?還是拿情侶配對舉例子,一種評價方法就是,看情侶彼此的滿意程度。比如,有的人當媒人,介紹的每一對情侶都極其滿意,有的人當媒人,雖然把情侶都湊在了一起,介紹的每一對情侶只是略微有意向,但是沒和最喜歡的在一起。

這個喜歡程度,就是給原本的二分圖,加了一個權重。

圖1 權重二分圖的最大匹配問題

在權重的前提下,該如何尋找最大匹配,且使得權重最大呢?KM算法就是為了解決這個問題的。

權重問題的轉化 / KM算法和匈牙利算法的關系

我剛開始學習的時候,根本沒有想明白,KM算法和匈牙利算法的關系。

遇到不會的問題,一個思路就是想辦法轉換成自己會的問題。我們現在知道匈牙利算法能解決最大匹配的問題,現在加了權重,KM算法實際上就是想了個辦法,將問題轉換成了匈牙利算法可以解決的形式。

現在二分圖帶了權重,可以理解為加了一種約束,這種約束讓我們優先選擇那些權重大的邊出來,進行匹配。

因此我們要先把權重最大的邊都挑出來,學術一點,就是挑一個子圖出來。因為我們挑出來的都是權重最大的邊,我們只要在這個子圖中,找到最大匹配,這個最大匹配一定是權重最大的(很重要,意思就是這個子圖里,在上面隨便找都是權重最大的匹配,這樣我們就能用匈牙利算法解決問題了)。流程就是:

找權重最大的邊組成的子圖--------→在這個子圖上找最大匹配

上述流程很簡單吧,有一個問題是,我們都找最大權重的邊組成子圖,這個子圖很小,很容易沖突。形象來說,大家找對象的要求都太高了,很可能會沒法滿足他們的要求。眾所周知,找不到對象是很慘的,因此對象還是得找的。這時候只能委屈一部分人,讓他稍微降低一下的要求,讓他從別的人里挑對象。

因此目前的流程變成了:

-----------

這個KM算法的流程,核心思想就是:優先選擇最滿意的,因為要求太高找不到對象的那些人,降低標準擴大擇偶范圍,直到找到對象為止。

這個問題中,找最大匹配的那一部分我們會了呀,用匈牙利算法就搞定了。剩下就是兩個問題了:

(1)怎么找到這個所謂的“權重最大的子圖”。

(2)怎么擴大擇偶范圍。既不能降得太低,也不能不降。

上述兩個問題,就是KM算法的精髓。

這個權重最大的子圖,就是“相等子圖”。擴大擇偶范圍,就是“頂標的更新---建立新的相等子圖”的過程。

要注意的是,上面說的權重最大,并不是整個圖的范圍內權重越大越好,而是目前能力范圍內我們能選的最大的權重邊(畢竟有些人需要降低標準才能找到對象)。

接下來就要講如何解決上面提出的兩個問題。

第一個問題 如何尋找“權重最大的”子圖?

首先強調一點,我們的這個子圖的目的,是為了實現一個效果:

在這個子圖上,不考慮權重找到最大匹配 等價于 在帶權重的圖上找權重最大的最大匹配。

我們挑一伙人出來,這些人彼此的滿意度都比較高,那些低的暫時不考慮。在這伙人里找對象。找不到了再考慮加人進來。

為了實現這個目標,我們給每個人,增加一個頂標。我們暫不考慮這個頂標是怎么加的,將在下一步中再詳細講這個問題。現在假設我們已經有一個頂標了。

這個頂標是我們決定一條邊是否加入子圖的依據。頂標可以理解為擇偶的最高標準,如果雙方的適配程度達到了這個最高標準,就加入到擇偶范圍內來,就是加入到子圖中。

因此,比如說小王擇偶的最高標準是

,小李擇偶最高標準。小王和小李的喜歡程度是 (即二分圖中,小王和小李的連線權重),若

,

小王和小李的連線就加入子圖中,進入擇偶候選人范圍。注意到上面這個等式,于是這樣選出來的子圖,叫做相等子圖。

然而這個最高標準,是不斷變化的。也就是下一個問題,如何不斷地調整最高標準,讓擇偶范圍不斷變化。

第二個問題 如何擴大擇偶范圍?

我們這里拿一個具體的例子來看。

這里有5個女生x1-x5, 5個男生y1-y5。他們之間為0就是沒有連線,大于0的數是權重,就是他們相互喜歡的程度。

第一步,最高標準初始化。

需要注意的是,我們是一個無向的二分圖,意思就是權重是雙方共同的喜歡程度,因此可以選一個人作為代表就行了。于是,我們讓女生做單方面的選擇。

于是男生們的頂標都設為0。

一開始女生們都想找最喜歡的對象,我們將她們的最高標準都設為她們最喜歡的那個。比如,x1對所有男生都有意向,喜歡程度分別是3,5,5,4,1。那小王目前的最高標準就是5。

在第一次選擇中,y2、y3加入擇偶范圍,其他三人暫不考慮。所有女生都這樣,選出自己最喜歡的加入擇偶范圍。

我們就得到了子圖

這樣的好處就是,這樣挑出來的子圖中,彼此喜歡程度一定是最大的。這樣我們就不用考慮權重的問題了,問題就變成了一個在局部子圖上,挑選最大匹配的問題,就可以用匈牙利算法解決了。

接下來,我們就用匈牙利算法來給她們分配對象。紅線表示匹配好了。

x1和x2都成功找到了對象。但是x3也愿意和y2一起。沖突了。一開始有了矛盾,我們先用匈牙利算法給她們嘗試解決一下。

我們找到一條增廣路,x3---y2---x1----y3。取個反,沖突就解決了。x3也找到了自己最滿意的對象。

輪到x4了。x4最滿意的是y2和y3,但是都被挑走了。我們先用匈牙利算法,給她也試一下。開始找增廣路。x4----y2----x3----y3------x1----y2----????,發現到了y2,找不下去了,又回到y3了。 我們優先廣度,試試另一條路。 x4----y3-----x1------y2-----x3------y3----???,發現又找不下去了。

此時此刻,匈牙利算法也解決不了了,就要開始擴大擇偶范圍了。

第二步,最高標準調整。

我們隨便選擇一條上面沒走下去的交替路(由于沒有成功找到另一個未匹配的對象,所以這條交替路沒有資格被稱為增廣路)比如就選這條:

x4----y2----x3----y3------x1----y2----????

這條路線,在很多文章里也會被成為交替樹。一旦找到增廣路,我們就能擴大匹配范圍,給x4也找到對象。但是現在失敗了,這個失敗的本質是和路線上的人發生了沖突。2

于是我們看看,有哪些人和x4的失敗有關。女生:x1,x3,x4。男生:y2,y3。

現在我們要協調這幾個人的擇偶最高標準(也就是他們的頂標),擴大擇偶范圍了。

首先,我們不能破壞原有的關系,原來的頂標都是設計好的,能保證選到自己最喜歡的對象。所以要保證他們之間最高標準不變,這樣保證原來的匹配不會發生變化。

這里讓上面和x4沖突的這些人里:女生的頂標減少,男生頂標增加,這樣他倆合起來標準不變。

但是,女生的頂標減小了,其他人的機會就來了。

再回到剛剛我們挑子圖的公式,就是小王配小李的這個等式,

,

現在小王因為和別人沖突了,降低了標準,W就減小了,也就是有些權重沒那么大的邊,現在有機會被加進子圖里了。

現在女生:x1,x3,x4都喜歡y2和y3,發生沖突了,而y1,y4,y5還沒被他們考慮。原本x1的標準是5,現在她要考慮y1的話,x1y1權重是3,需要降低2個標準。

同理,x1y4需要降低1; x3y1需要降低2, x3y4需要降低4-1=3;x3y5需要降低4-0=4。x4也一樣算法。

所以考慮到最大權重,最少要降低1個標準。

因此我們把x1,x3,x4的標準-1,y2,y3對應+1。

在這個標準下,我們依舊要挑滿足“兩人頂標和=兩人連線權重”的邊。

可以看出來,x4同學降低標準后,所有男同學都滿足她的標準了。

這時候按照匈牙利算法,x4和y1配對,沖突了,找到增廣路x4---y1---x2---y4。取反后,x4和y1配對,x2和y4配對。

再給x5找對象。x5也找到了y5作為對象。

現在所有人都有對象了。

此時他們的權重為4+2+3+0+3+0+1+1 +0+0 =14。

總結

以上是生活随笔為你收集整理的判别两棵树是否相等 设计算法_从匈牙利算法到KM算法的全部內容,希望文章能夠幫你解決所遇到的問題。

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