Going Home(二分图最大权匹配KM算法)

news2024/11/19 15:38:20

C-Going Home_2022图论班第一章图匹配例题与习题 (nowcoder.com)

在网格地图上有n个小人和n座房子。在每个单位时间内,每个小人都可以水平或垂直地移动一个单位步到相邻点。对于每个小矮人,你需要为他每走一步支付1美元的旅费,直到他进入一所房子。这项任务很复杂,因为每栋房子只能容纳一个小人。

你的任务是计算出把这n个小人送到n个不同的房子里所需要支付的最小金额。输入是场景的映射,a '。'表示一个空的空间,'H'表示这一点上有一个房子,'m'表示这一点上有一个小人。

你可以把网格地图上的每个点想象成一个相当大的正方形,所以它可以同时容纳n个小人;此外,如果一个小人没有进入房子就踩在有房子的网格上也是可以的。

输入描述:

输入中有一个或多个测试用例。每种情况都以给出两个整数N和M的一行开始,其中N是映射的行数,M是列数。其余的输入将是N行描述映射的代码。你可以假设N和M都在2到100之间。地图上的“H”和“m”的数量是一样的;最多有100栋房子。N和M的输入将以0结束。

输出描述:

对于每个测试用例,输出一行包含单个整数的行,这是您需要支付的最小金额,以美元为单位。

题解:

首先把人的位置与房子位置存储 

记录人到每一个房子的曼哈顿距离,

找到每个人的最大顶标,记得初始化房子的顶标为0

剩下就是KM的板子了

但是这道题是要我们求最小代价,所以我们记录距离时要变成相反数,这样求出的距离是最大的

最后输出- res就是最小代价

#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include<cstring>
#include<cmath>
#include<set>
using namespace std;
#define int long long
int n,m;
int p[105][2];
int h[105][2];
int a[105][105];
int link[105];
int lx[105],ly[105];
int x,y;
int vx[105],vy[105];
int dfs(int x)
{
	vx[x] = 1;
	for(int i = 1;i <= y;i++)
	{
		if(!vy[i]&&lx[x] + ly[i] == a[x][i])
		{
			vy[i] = 1;
			if(!link[i] || dfs(link[i]))
			{
				link[i] = x;
				return 1;
			}
		}
	}
	return 0;
}
int check()
{
	memset(link,0,sizeof link);
	memset(lx,0xf3,sizeof lx);
	memset(ly,0,sizeof ly);
	for(int i = 1;i <= x;i++)
	{
		for(int j = 1;j <= y;j++)
		{
			lx[i] = max(lx[i],a[i][j]);
		}
	}
	for(int i = 1;i <= x;i++)
	{
		while(1)
		{
			memset(vx,0,sizeof vx);
			memset(vy,0,sizeof vy);
			if(dfs(i))
			break;
			int d = 0x3f;
			for(int j = 1;j <= x;j++)
			{
				if(vx[j])
				{
					for(int k = 1;k <= y;k++)
					{
						if(!vy[k])
						{
							d = min(d,lx[j] + ly[k] - a[j][k]);
						}
					}
				}
			}
			if(d == 0x3f)
			return 0;
			for(int j = 1;j <= x;j++)
			if(vx[j])
			lx[j] -= d;
			for(int j = 1;j <= y;j++)
			if(vy[j])
			ly[j] += d;
		}
	}
	return 1;
}
void solve()
{
    x = 0,y = 0;
	for(int i = 1;i <= n;i++)
	{
		for(int j = 1;j <= m;j++)
		{
			char o;
			cin >> o;
			if(o == 'H')
			{
				h[++y][0] = i;
				h[y][1] = j;
			}
			if(o == 'm')
			{
				p[++x][0] = i;
				p[x][1] = j;
			}
		}
	}
	for(int i = 1;i <= x;i++)
	{
		for(int j = 1;j <= y;j++)
		{
			a[i][j] = -(abs(p[i][0] - h[j][0]) + abs(p[i][1] - h[j][1]));
		}
	}
	if(check())
	{
		int res = 0;
		for(int i = 1;i <= y;i++)
		{
			res += a[link[i]][i];
		}
		cout << -res<<"\n";
	}
}
//17 5
//
signed main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
	int t = 1;
//	cin >> t;
    while(t)
	{
		cin >> n >> m;
		if(!n&&!m)
		break;
		solve();
	} 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git命令笔记,下载、提交代码、解决冲突、分支处理

下载代码&#xff0c;复制https地址到本地文件夹&#xff0c;鼠标右键选择git bash后输入命令 git clone https://gitee.com/View12138/ViewFaceCore.git 下载后初始化&#xff1a;git init 下载代码后不运行报错&#xff08;如下&#xff09;&#xff0c;需要执行初始化命令…

Google ProtoBuf的使用

Google的protobuf太好用了&#xff0c;又小&#xff0c;读写又快 跑步快慢受鞋的影响太大了&#xff0c;但是造鞋的工具研究起来还是很有难度的&#xff0c;百度真是充斥的大量的转载文件&#xff0c;不管能不能用、能不能看懂&#xff0c;反正是各种转载&#xff0c;有的连错…

2023年企业固定资产管理怎么破局?

2022年已经在风雨中过去&#xff0c;转眼我们迎来了2023年。过去的一年&#xff0c;固定资产管理的痛依旧历历在目&#xff0c;如何让新的一年中&#xff0c;固定资产管理工作有所突破&#xff0c;不再承受固定资产资产管理的痛处&#xff0c;是每个企业管理者和企业固定资产管…

snap打包初步了解

前言 和snap比较类似的有三种打包方式&#xff1a; Snap Flatpak appimage Appimage是将所有的资源打包在一起&#xff0c;以一个类似与独立exe的方式执行&#xff0c;虽然简单使用&#xff0c;但是解压资源和本地缓存数据都比较麻烦。 Flatpak和snap十分类似&#xff0c;但…

XXE无回显攻击详解

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是XXE无回显攻击详解。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授权设…

怎么把element的tootip设置为点击后出现提示框,且在提示框里面放其他元素,vue2动态给对象添加属性并实现响应式应答,样式穿透

怎么把element的tootip设置为点击后出现提示框 我目前有一个需求&#xff0c;就是要点击文字才会出现提示框&#xff0c;而不是hover上去就以后&#xff0c;找资料看文档&#xff0c;看了半天让我终于实现了&#xff0c;其实也不难&#xff0c;可能是最开始我没有理解value&am…

Akka 进阶(一)Dispatcher调度器

目录一 Dispatcher 任务分发1.1 理解什么是Dispatcher1.2 Executor的分类1.3 基本使用1.4 其他类型的调度器在Akka中&#xff0c;Actor的消息通信和任务执行建立在一个完全透明的调度机制之上&#xff0c;它屏蔽了底层线程&#xff08;池&#xff09;的实现细节&#xff0c;几乎…

Java: static,final,代码块 的详解

Java: static&#xff0c;final&#xff0c;代码块 的详解 每博一文案 山本文绪说过这样一句话&#xff1a;哪些决定放弃了的事&#xff0c;就请放弃得干干净净。哪些决定再也不见面的人&#xff0c;就真 的不要再见面了&#xff0c;不要再做背叛自己的事&#xff0c;如果想要…

CentOS7迷你版安装Redis并配置基础信息

1. 安装gcc、wget依赖 yum install gcc yum install wget 2. 使用命令&#xff1a;wget http://download.redis.io/releases/redis-6.2.5.tar.gz 下载安装包&#xff0c;注意要先cd到要下载到的目标位置&#xff09; 3. tar -zxvf redis-6.2.5.tar.gz 解压压缩包 4. cd redis-…

学习周报-20221223

文章目录一 Linux的ACL访问控制列表一 基础概念1.1 起因1.2 系统支持1.3 相关定义二 查看ACL权限2.1 简单查看2.2 详细查看2.3 具体配置三 更改ACL权限3.1 添加或修改ACL3.2 输出和输入3.3 设置ACL掩码3.4 递归修改ACL3.5 删除ACL3.6 控制默认ACL权限二 Linux磁盘分区中物理卷&…

zabbix6.0安装教程(七):从web界面安装

zabbix6.0安装教程&#xff08;七&#xff09;&#xff1a;从web界面安装 目录一、欢迎主界面二、先决条件检查三、配置数据库连通性四、配置本章节提供有关Zabbx Web界面的部署步骤说明。Zabbix 前端是由PHP语言编写&#xff0c;所以其网页服务的运行需要支持PHP语言的网站服务…

Allegro如何任意角度走线操作指导

Allegro如何任意角度走线操作指导 Allegro支持在PCB上进行任意角度走线,尤其是在高速设计的时候,尤为常见,如下图 具体操作如下 选择add connect命令Find选择Cline segs

谷歌要给移动VR定规矩

代号牛轧糖的最新安卓7.0手机操作系统发布两天后&#xff0c;谷歌公司开发的虚拟现实&#xff08;VR&#xff09;平台Daydream&#xff08;下称“白日梦”&#xff09;也将在未来几周推出。与平台一同推出的&#xff0c;还有来自Hulu和YouTube等视频网站“网红”们的全新视频内…

【软件工程】实验3:软件详细设计

CAM系统的类图 CAM系统的顺序图 CAM系统模拟实现&#xff08;CAM工具库封装&#xff09; 1、代码运行界面 &#xff08;1&#xff09;根据提示输入要加工的图形类型 &#xff08;2&#xff09;J-Soft软件会根据输入的数字提示用户输入不同的图形参数&#xff0c;图形参数输入…

函数栈帧(栈区)

函数栈帧&#xff08;栈区&#xff09;一.前言二.main函数空间的开辟&#xff08;函数调用是如何做到的&#xff09;三.main函数内部的变量初始化&#xff08;局部变量是如何创建的以及为什么是随机值&#xff09;四.main函数内部的函数创建1.函数是如何传参的2.传参的顺序以及…

物联网通信技术原理第2章 无线通信技术(期末重点)

目录 2.1 无线通信基本知识 2.1.2 无线通信的特点 2.2 无线信道 2.2.1 恒参无线信道举例 2.2.2 恒参无线信道特性及其对信号传输的影响 1. 幅度—频率畸变 2. 相位—频率畸变​编辑 2.2.3 随参无线信道距离 1、短波电离层反射 2、对流层散射信道 2.2.4 随参信道特性及…

漏洞深度分析|Apache Karaf 4.2.16 存在JNDI 注入漏洞

项目地址 GitHub - apache/karaf: Mirror of Apache Karaf 项目介绍 Apache Karaf是一个模块化运行时&#xff0c;支持多种框架和编程模型&#xff08;REST/API、web、spring boot 等&#xff09;。它提供了统包功能&#xff0c;您可以毫不费力地直接利用这些功能&#xff0…

戴维南定理

定理内容&#xff1a;任意二端口直流网络都可以被一个等效电路替换&#xff0c;这个等效电路只包含一个电压源和一个串联电阻&#xff0c;如图1所示。 图1 戴维南定理的作用 1、分析含有非串联或非并联电源的网络 2、用最少数量的元件实现复杂网络的端口特性&#xff08;端口前…

【深入浅出Spring原理及实战】「开发实战系列」SpringSecurity原理以及实战认证分析开发指南

前提介绍 承接上一篇文章&#xff0c;相信大家应该已经对SpringSecurity的原理有了一定的认识&#xff0c;而本篇文章给大家带来的则是在实际业务开发中的技术指南&#xff0c;希望对你有所帮助。所谓知彼知己方能百战百胜&#xff0c;用Spring Security来满足我们的需求最好了…

我们国家都有哪些信息安全标准

写在前面 早年刚参加信息安全工作更多的学点皮毛技术&#xff0c;到处找安全工具&#xff0c;跟踪poc&#xff0c;拿到一个就全网扫一遍&#xff0c;从来没有想过&#xff0c;系统化的安全工作应该怎样搞?我做的工作在安全体系中处于哪个阶段? 后来有机会做企业安全建设&…