二分图带权匹配-Kuhn-Munkres算法模板 [二分图带权匹配]
尴尬。。。理解不太好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算法模板 [二分图带权匹配]的更多相关文章
- UVA1349(带权二分图最大匹配 --> KM算法模板)
UVA1349 题意:给定一些有向带权边,求出把这些边构造成一个个环,总权值最小 解法: 对于带权的二分图的匹配问题可以用通过KM算法求解. 要求最大权匹配就是初始化g[i][j]为0,直接跑就可以: ...
- 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 三维几 ...
- 二分图带权匹配、最佳匹配与KM算法
---------------------以上转自ByVoid神牛博客,并有所省略. [二分图带权匹配与最佳匹配] 什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得集合中边的权值之和 ...
- 匈牙利算法模板 hdu 1150 Machine Schedule(二分匹配)
二分图:https://blog.csdn.net/c20180630/article/details/70175814 https://blog.csdn.net/flynn_curry/artic ...
- 运动员最佳匹配问题 KM算法:带权二分图匹配
题面: 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势. ...
- 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 ...
- 二分图最大权值匹配 KM算法 模板
KM算法详解+模板 大佬讲的太好了!!!太好了!!! 转载自:http://www.cnblogs.com/wenruo/p/5264235.html KM算法用来求二分图最大权完美匹配. 本文配合该 ...
- 模板—算法—整体二分(区间k小值)
模板—算法—整体二分(区间k小值) Code: #include <cstdio> #include <algorithm> using namespace std; #def ...
- 【模板】二分图最大权完美匹配(KM算法)/洛谷P6577
题目链接 https://www.luogu.com.cn/problem/P6577 题目大意 给定一个二分图,其左右点的个数各为 \(n\),带权边数为 \(m\),保证存在完美匹配. 求一种完美 ...
随机推荐
- 操作bin目录下的文件
string dir = AppDomain.CurrentDomain.BaseDirectory + "Video"; if (!System.IO.Directory.Exi ...
- java.lang.ThreadLocal的作用和原理?列举在哪些程序中见过ThreadLocal的使用?
java.lang.ThreadLocal的作用和原理?列举在哪些程序中见过ThreadLocal的使用? 说明类java.lang.ThreadLocal的作用和原理.列举在哪些程序中见过Threa ...
- 单个机器部署redis集群模式(一键部署脚本)
一.检查机器是否安装gcc.unzip.wget 二.部署模式 #模式1: 将所有主从节点以及sentinel节点部署在同一台机器上 #模式2: 将一个数据节点和一个sentinel节点部署在一台机器 ...
- vue 学习一 组件生命周期
先上一张vue组件生命周期的流程图 以上就是一个组件完整的生命周期,而在组件处于每个阶段时又会提供一些周期钩子函数以便我们进行一些逻辑操作,而总体来讲 vue的组件共有8个生命周期钩子 beforeC ...
- Android客户端转换php服务端获取的时间戳的转换
今天在用JSON获取后台的数据的时候,发现一个奇怪的现象就是返回来的时间戳都是1970年这样的,很是纠结,最后发现时php和Java中时间的格式不一样造成的,所以我们本地客户端要做一个转换: /** ...
- 字符串hash+回文树——hdu6599
拖了很久才补的回文树,感觉网上的博客都是一个做法..回文树统计不同种类的回文串出现次数,然后用字符串hash来判每个回文子串是否符合要求 #include<bits/stdc++.h> u ...
- C语言itoa()函数和atoi()函数详解(整数转字符C实现)【转载】
文章转载自https://www.cnblogs.com/bluestorm/p/3168719.html C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. ...
- csp-s模拟测试96
csp-s模拟测试96 $T1$一眼慢速乘,$T2$稍证一手最优性尝试用神奇数据结构优化,无果,弃.$T3$暴力+信仰. 100 03:16:38 95 03:16:56 35 03:17:10 23 ...
- HDU1556-Color the ball-前缀和/线段树/树状数组
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...
- SparkSession、SparkContext、SQLContext和HiveContext之间的区别。
SparkContext 是什么? 驱动程序使用SparkContext与集群进行连接和通信,它可以帮助执行Spark任务,并与资源管理器(如YARN 或Mesos)进行协调. 使用SparkCont ...