尴尬。。。理解不太好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. kali环境配置

    1.配置源及刷新软件列表 建议用官方默认源: # vi /etc/apt/sources.list deb http://http.kali.org/kali kali-rolling main no ...

  2. MJExtension常用方法

    一.MJExtension第三方框架 我们在iOS开发过程中,我们常常需要将字典数据(也就是JSON数据)与Model模型之间的转化,例如网络请求返回的微博数据.等等,如果我们自己全部手动去创建模型并 ...

  3. svg圆环缓冲动画

    代码如下 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8& ...

  4. CSIC_716_20191206【并发编程理论基础】

    进程:正在执行的一个过程,进程是对正在执行过程的一个抽象.区别于程序, 进程的三种状态:  进程是动态的. 就绪态ready:   进程具备运行状态,等待操作系统分配处理器 运行状态running:进 ...

  5. H5调用腾讯地图

    获取当前定位的经纬度并在容器内显示当前位置 (安卓上的位置有点偏差) 在vue的index.html中需要引用 template <div id="container" st ...

  6. Delphi 取整函数round、trunc、ceil和floor

    Delphi 取整函数round.trunc.ceil和floor 1.Round(四舍六入五留双)功能说明:对一个实数进行四舍五入.(按照银行家算法)例:var i, j: Integer;begi ...

  7. 牛客多校第三次B——线段树维护线性基交

    写线性基交函数时调试了半天.. #include<bits/stdc++.h> using namespace std; #define ll long long #define maxn ...

  8. 矩阵乘法分配律+bitset优化——hdu4920

    因为是模3,所以把原矩阵拆成两个01矩阵,然后按分配律拆开分别进行矩阵乘法,行列用bitset来存进行优化即可 注意 int bitset<int>::count() 函数可以统计bits ...

  9. NX二次开发-bat脚本文件切换NX的环境变量(NX路径和语言)

    路径环境变量切换到NX9.bat @echo off setx /M UGII_BASE_DIR "D:\Program Files\Siemens\NX 9.0" ------- ...

  10. Mybatis笔记 - Mapper动态代理

    使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. Mapper接口开发方式是基于入门程序的基础上,对 控制程序 进行分层开发,程序员只需要 编写mappe ...