匈牙利演算法 KM演算法

2021-06-29 05:05:11 字數 1452 閱讀 8995

匈牙利演算法:

求最大匹配,那麼我們希望每乙個在左邊的點都盡量找到右邊的乙個點和它匹配。我們依次列舉左邊的點x的所有出邊指向的點y,若y之前沒有被匹配,那麼(x,y)就是一對合法的匹配,我們將匹配數加一,否則我們試圖給原來匹配y的x』重新找乙個匹配,如果x』匹配成功,那麼(x,y)就可以新增為一對合法的匹配。給x』尋找匹配的過程可以遞迴解決.

從一邊的未飽和點出發,尋找增廣路

複雜度:o(ve)

const

int maxn=555;//最大頂點數

vector

g[maxn];//g[i]表示與左邊點i相連的右邊的點

int nx,ny;//每一側的頂點數

int tot;//最大匹配數

int from[maxn];//from[y]表示與yi匹配的x頂點 // cy陣列

bool use[maxn];//標記陣列

bool match(int x)}}

return

false;

}int hungary()

return tot;

}

km演算法:

轉給定乙個帶權的二分圖,求權值最大的完備匹配

相等子圖的完備匹配=原圖的最大權匹配

1. 初始化可行性頂標

2.對n個點在相等子圖中尋找增廣路

3.求得最大權

演算法時間複雜度o(

n3)

#include

#include

#include

#include

const

int maxn=310;//最大頂點數

const

int inf=0x3f3f3f3f;

using

namespace

std;

int n;//一側的頂點個數

int lx[maxn],ly[maxn],linker[maxn];//記錄兩側的頂標,與yi匹配的x點

int slack[maxn];//鬆弛標記

bool visx[maxn],visy[maxn];//訪問標記

int g[maxn][maxn];//記錄邊權

bool match(int x)

}else

if(slack[y]>tmp) slack[y]=tmp;//動態維護slack

}return

false;

}int km()

for(int x=0;xfor(int i=0;iwhile(1)

}int sum=0;

for(int i=0;iif(linker[i]!=-1)

sum+=g[linker[i]][i];

}return sum;

}

匈牙利演算法,KM演算法

bool find int x return false 主程式 for i 1 i n i include include include include include include include include include include include include include...

2019 7 22 匈牙利演算法,KM演算法

這幾天知識點量太大,一時間不易吸收。先占個坑,慢慢填 分享一位博主dark scope的思路,簡單易懂還有趣,雖然是初學,也馬馬虎虎懂了個大概 define maxn 100000 int n,m n個男生 m個女生 二分圖 男生在左女生在右 bool line maxn maxn 兩者之間相互喜歡...

傳統演算法 匈牙利演算法 KM演算法

做為乙個演算法工程師,除了了解各種nn網路結構,調的一手好引數,傳統演算法這一部分也不能拉下。因此著手寫這個系列,一方面加深自己對演算法的理解,另一方面 在實際業務中的應用,畢竟ac不是目的,融匯貫通的應用才是真目標。問題 剛入職某網約車平台的l同學被安排了個任務,如下圖所示,在一塊區域有m個司機和...