KM算法

给定无向有权图,求完美匹配的最大权值
在匈牙利算法的基础上,多出了边权值和完美匹配(即匹配者和被匹配者的数量相同)
现在有N男N女,男生和女生每两个人之间有好感度,我们希望把他们两两配对,并且最后希望好感度和最大。

工人与工作匹配,使得效率最大化
博客

题目

时间复杂度O(nxnxny)

nx匹配ny

传送门

#include 
#include 
#include 
#include 
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=505;
int nx,ny;//nx是匹配者,ny是被匹配者
int g[maxn][maxn];//二分图情况,女生对男生的好感度情况
bool vis_boy[maxn],vis_girl[maxn];//被匹配者是否被访问
int ex_boy[maxn],ex_girl[maxn];//男女生的期望值
int match[maxn];//匹配情况
int slack[maxn];//记录每个汉子如果能被妹子倾心最少还需要多少期望值
int cnt=1;
inline int read(){
    char ch=getchar();int x=0,f=1;
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
void init(){
    for(int i=0;iny)printf("Case %d: -1\n",cnt++);
        else{
            init();
            while(e--){
                int u,v,w;
                u=read(),v=read(),w=read();
                if(w>=0)g[u][v]=w;//学生对房间的感觉为负,就不能匹配
            }
            printf("Case %d: %d\n",cnt++,km());
        }
        //printf("%d\n",km());
    }
    return 0;
}

模板

传送门

#include 
#include 
#include 
#include 
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=310;
int nx,ny,n;//nx是匹配者,ny是被匹配者
int g[maxn][maxn];//二分图情况,女生对男生的好感度情况
bool vis_boy[maxn],vis_girl[maxn];//被匹配者是否被访问
int ex_boy[maxn],ex_girl[maxn];//男女生的期望值
int match[maxn];//匹配情况
int slack[maxn];//记录每个汉子如果能被妹子倾心最少还需要多少期望值
void init(){

}
bool dfs(int girl){//为女孩子配对
    vis_girl[girl]=true;
    for(int boy=0;boy

你可能感兴趣的:(KM算法)