//HDU 1533
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=100;
const int M=100;
const int INF=1e8;
int mp[N][N];
int vx[N],vy[N];
int lx[N],ly[N];
int slack[N];
int match[N];
int n;
int dfs(int u){
vx[u]=1;
for(int v=0;v<n;v++){
if(vy[v])continue;
if(lx[u]+ly[v]==mp[u][v]){
vy[v]=1;
if(match[v]==-1||dfs(match[v])){
match[v]=u;
return 1;
}
}
else slack[v]=min(slack[v],lx[u]+ly[v]-mp[u][v]);
}
return 0;
}
void _km(){
memset(lx,0,sizeof(lx));
memset(ly,0,sizeof(ly));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)lx[i]=max(lx[i],mp[i][j]);
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
slack[j]=INF;
}
while(1){
memset(vx,0,sizeof(vx));
memset(vy,0,sizeof(vy));
if(dfs(i))break;
else {
int tmp=INF;
for(int j=0;j<n;j++){
if(!vy[j])tmp=min(tmp,slack[j]);
}
for(int j=0;j<n;j++){
if(vx[j])lx[j]-=tmp;
if(vy[j])ly[j]+=tmp;
else slack[j]-=tmp;
}
}
}
}
}
int main(){
return 0;
}
二分图最大权匹配算法
最新推荐文章于 2024-01-13 23:43:09 发布