- KM 알고리즘은이 "최고 표준"이 (보고 싶지 않은) 한 무리의 정리는 침묵 것을 이해하기 매우 어려운
,하지만 코드는 여전히 상대적으로 좋은 기록이다
가 된 그래프 최대 매칭 알고리즘 헝가리를 기반으로합니다.
하나님의 생각을 봐 블로그 그것을 돌진! -> | 포털 | <-
코드 최적화 :
O 시간 복잡도 (N ^ 3)
코드 부착
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int inf=0x7fffffff,maxn=1010;
int w[maxn][maxn],link[maxn],lx[maxn],ly[maxn],slack[maxn];
bool visy[maxn],visx[maxn];
bool dfs(int node){
visx[node]=1;
For(i,1,m){
if(visy[i]) continue;
int ls=lx[node]+ly[i]-w[node][i];
if(ls==0){
visy[i]=1;
if(link[i]==-1 || dfs(link[i])){
link[i]=node;
return 1;
}
}
if(ls<slack[i])
slack[i]=ls;
}
return 0;
}
int km(){
int sum=0;
ak(ly);
For(i,1,n){
lx[i]=-inf;
For(j,1,n){
if(lx[i]<w[i][j])
lx[i]=w[i][j];
}
}
memset(link,-1,sizeof(link));
For(i,1,n){
For(j,1,m) slack[j]=inf;
while(1){
ak(visx),ak(visy);
if(dfs(i)) break;
int d=inf;
For(j,1,m){
if(!visy[j] && slack[j]<d)
d=slack[j];
}
For(j,1,n)
if(visx[j])
lx[j]-=d;
For(j,1,m)
if(visy[j])
ly[j]+=d;
else slack[j]-=d;
}
}
For(i,1,m){
if(link[i]>-1){
sum+=w[link[i]][i];
}
}
return sum;
}
위의 블로그는 여기를 반복하지, 이러한 세부 사항이 해결 썼다.