//km
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
const int mod=1e9+7;
typedef long long ll;
const int MAXN = 305;
const int INF = 0x3f3f3f3f;
int N;
int aa[MAXN];
int bb[MAXN];
int va[MAXN];
int vb[MAXN];
int li[MAXN];
int match[MAXN];
int ab[MAXN][MAXN];
bool dfs(int a){
va[a]=true;
for(int b=0;b<N;b++){
if(vb[b]) continue;
int gap=aa[a]+bb[b]-ab[a][b];
if(gap==0){
vb[b]=1;
if(match[b]==-1||dfs(match[b])){
match[b]=a;
return true;
}
}
else {
li[b]=min(li[b],gap);
}
}
return false;
}
int km(){
memset(match, -1, sizeof(match));
memset(bb, 0, sizeof(bb));
for(int a=0;a<N;a++){
aa[a]=ab[a][0];
for(int b=1;b<N;b++){
aa[a]=max(aa[a],ab[a][b]);
}
}
for(int a=0;a<N;a++){
fill(li,li+N, INF);
while (1){
memset(va,0,sizeof(va));
memset(vb, 0, sizeof(vb));
if(dfs(a)) break;
int d=INF;
for(int b=0;b<N;b++){
if(!vb[b]){
d=min(d,li[b]);
}
}
for(int i=0;i<N;i++){
if(va[i]){
aa[i]-=d;
}
if(vb[i]){
bb[i]+=d;
}
else {
li[i]-=d;
}
}
}
}
int res=0;
for(int i=0;i<N;i++){
res+=ab[match[i]][i];
}
return res;
}
KM算法模版
最新推荐文章于 2022-08-18 11:30:02 发布