尴尬。。。理解不太好T T


 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f const int maxn=; int n;
//标杆序号
int lx[maxn],ly[maxn];
//是否被搜索过
bool sx[maxn],sy[maxn];
int weight[maxn][maxn],mat[maxn]; inline int maxx(const int &n1,const int &n2){
return n1>n2?n1:n2;
} bool dfs(int x){
sx[x]=;
for(int i=;i<n;i++)
if(!sy[i]&&lx[x]+ly[i]==weight[x][i]){
sy[i]=;
if(mat[i]==-||dfs(mat[i])){
mat[i]=x;
return ;
}
}
return ;
} //x==0最小
//x==1最大
int KM(int flag){
if(!flag)
for(int i=;i<n;i++)
for(int j=;j<n;j++)
weight[i][j]=-weight[i][j];
memset(mat,-,sizeof mat);
//初始化标杆
for(int i=;i<n;i++){
lx[i]=-inf;
ly[i]=;
for(int i=;i<n;i++)
for(int j=;j<n;j++)
lx[i]=maxx(lx[i],weight[i][j]);
}
for(int i=;i<n;i++)
while(){
memset(sx,,sizeof sx);
memset(sy,,sizeof sy);
if(dfs(i)) break;
//修改标杆
int mic=inf;
for(int j=;j<n;j++)
if(sx[j])
for(int k=;k<n;k++)
if(!sy[k]&&lx[j]+ly[k]-weight[j][k]<mic)
mic=lx[j]+ly[k]-weight[j][k];
if(mic==) return -;
for(int j=;j<n;j++){
if(sx[j]) lx[j]-=mic;
if(sy[j]) ly[j]+=mic;
}
for(int j=;j<n;j++)
printf("%d ",lx[j]);
puts("");
for(int j=;j<n;j++)
printf("%d ",ly[j]);
puts("\n");
}
int sum=;
for(int i=;i<n;i++)
if(mat[i]>=)
sum+=weight[mat[i]][i];
if(!flag) sum=-sum;
return sum;
} int main(){
scanf("%d",&n);
for(int i=;i<n;i++)
for(int j=;j<n;j++)
scanf("%d",&weight[i][j]);
printf("%d\n",KM());
return ;
}
/*
5
3 4 6 4 9
6 4 5 3 8
7 5 3 4 2
6 3 2 2 5
8 4 5 4 7 KM(1)=29
*/

二分图带权匹配-Kuhn-Munkres算法模板 [二分图带权匹配]的更多相关文章

  1. UVA1349(带权二分图最大匹配 --> KM算法模板)

    UVA1349 题意:给定一些有向带权边,求出把这些边构造成一个个环,总权值最小 解法: 对于带权的二分图的匹配问题可以用通过KM算法求解. 要求最大权匹配就是初始化g[i][j]为0,直接跑就可以: ...

  2. acm算法模板(1)

    1. 几何 4 1.1 注意 4 1.2 几何公式 4 1.3 多边形 6 1.4 多边形切割 9 1.5 浮点函数 10 1.6 面积 15 1.7 球面 16 1.8 三角形 17 1.9 三维几 ...

  3. 二分图带权匹配、最佳匹配与KM算法

    ---------------------以上转自ByVoid神牛博客,并有所省略. [二分图带权匹配与最佳匹配] 什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得集合中边的权值之和 ...

  4. 匈牙利算法模板 hdu 1150 Machine Schedule(二分匹配)

    二分图:https://blog.csdn.net/c20180630/article/details/70175814 https://blog.csdn.net/flynn_curry/artic ...

  5. 运动员最佳匹配问题 KM算法:带权二分图匹配

    题面: 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势. ...

  6. HDU 2389 Rain on your Parade(二分匹配,Hopcroft-Carp算法)

    Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K (Java/Ot ...

  7. 二分图最大权值匹配 KM算法 模板

    KM算法详解+模板 大佬讲的太好了!!!太好了!!! 转载自:http://www.cnblogs.com/wenruo/p/5264235.html KM算法用来求二分图最大权完美匹配. 本文配合该 ...

  8. 模板—算法—整体二分(区间k小值)

    模板—算法—整体二分(区间k小值) Code: #include <cstdio> #include <algorithm> using namespace std; #def ...

  9. 【模板】二分图最大权完美匹配(KM算法)/洛谷P6577

    题目链接 https://www.luogu.com.cn/problem/P6577 题目大意 给定一个二分图,其左右点的个数各为 \(n\),带权边数为 \(m\),保证存在完美匹配. 求一种完美 ...

随机推荐

  1. 使用PHP如何去除字符串结尾的字符

    前言 在工作中遇到一个需求:一串字符串,如"迅雷官方下载"."快播5.0下载",需要去掉他们结尾的"官方下载"和"下载" ...

  2. qt创建无qt工程

    qt创建无qt工程,cmake . eclipse 编写makefile  代码

  3. vue导出table内容至excel——转

    一:在项目中需要安装2个依赖项,如下命令: npm install --save file-saver xlsx 二:在vue文件中如下使用即可: <template> <div c ...

  4. Android Studio 安装及汉化

    { https://www.bilibili.com/video/av48649403?from=search&seid=15739157224002905777 Tool: https:// ...

  5. Delphi 窗体的释放和判断窗体是否存在

    常规释放和关闭: Form.Free   -   释放Form占用的所有资源.Free后,Form指针不能再使用,除非对Form重新赋值.   Form.Hide   -   隐藏Form.可以调用f ...

  6. 经典换根dp——hdu2196

    给定一棵边权树,求距离每个点最远的点,输出这个距离 #include<bits/stdc++.h> using namespace std; #define N 10005 ]; int ...

  7. Python 爬取拉钩网工作岗位

    如果拉钩网html页面做了调整,需要重新调整代码 代码如下 #/usr/bin/env python3 #coding:utf-8 import sys import json import requ ...

  8. [转]gulp打包工具总结

    与grunt类似,gulp也是构建工具,但相比于grunt的频繁IO操作,gulp的流操作能更快更便捷地完成构建工作.gulp借鉴了Unix操作系统的管道(pipe)思想,前一级的输出,直接变成后一级 ...

  9. Api:temple

    ylbtech-Api: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbtech.cnb ...

  10. upper_bound() lower_bound() 用法

    头文件 #include<algorithm> #include<iostream>#include<vector>#include<algorithm> ...