【二分图最大权匹配】【KM算法模板】

2024-08-31 16:32

本文主要是介绍【二分图最大权匹配】【KM算法模板】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
using namespace std;/*  KM算法*   复杂度O(nx*nx*ny)*  求最大权匹配*   若求最小权匹配,可将权值取相反数,结果取相反数*  点的编号从0开始*/
const int N = 310;
const int INF = 0x3f3f3f3f;
int nx,ny;//两边的点数
int g[N][N];//二分图描述
int linker[N],lx[N],ly[N];//y中各点匹配状态,x,y中的点标号
int slack[N];
bool visx[N],visy[N];bool DFS(int x)
{visx[x] = true;for(int y = 0; y < ny; y++){if(visy[y])continue;int tmp = lx[x] + ly[y] - g[x][y];if(tmp == 0){visy[y] = true;if(linker[y] == -1 || DFS(linker[y])){linker[y] = x;return true;}}else if(slack[y] > tmp)slack[y] = tmp;}return false;
}
int KM()
{memset(linker,-1,sizeof(linker));memset(ly,0,sizeof(ly));for(int i = 0;i < nx;i++){lx[i] = -INF;for(int j = 0;j < ny;j++)if(g[i][j] > lx[i])lx[i] = g[i][j];}for(int x = 0;x < nx;x++){for(int i = 0;i < ny;i++)slack[i] = INF;while(true){memset(visx,false,sizeof(visx));memset(visy,false,sizeof(visy));if(DFS(x))break;int d = INF;for(int i = 0;i < ny;i++)if(!visy[i] && d > slack[i])d = slack[i];for(int i = 0;i < nx;i++)if(visx[i])lx[i] -= d;for(int i = 0;i < ny;i++){if(visy[i])ly[i] += d;else slack[i] -= d;}}}int res = 0;for(int i = 0;i < ny;i++)if(linker[i] != -1)res += g[linker[i]][i];return res;
}
//HDU 2255
int main()
{int n;while(scanf("%d",&n) == 1){for(int i = 0;i < n;i++)for(int j = 0;j < n;j++)scanf("%d",&g[i][j]);nx = ny = n;printf("%d\n",KM());}return 0;
}


这篇关于【二分图最大权匹配】【KM算法模板】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124410

相关文章

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

Nginx路由匹配规则及优先级详解

《Nginx路由匹配规则及优先级详解》Nginx作为一个高性能的Web服务器和反向代理服务器,广泛用于负载均衡、请求转发等场景,在配置Nginx时,路由匹配规则是非常重要的概念,本文将详细介绍Ngin... 目录引言一、 Nginx的路由匹配规则概述二、 Nginx的路由匹配规则类型2.1 精确匹配(=)2

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注