匈牙利演算法:
求最大匹配,那麼我們希望每乙個在左邊的點都盡量找到右邊的乙個點和它匹配。我們依次列舉左邊的點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個司機和...