牛客练习赛30 D-消消乐(二分图匹配之最小点覆盖)

京东笔试编程题之消消乐 题目:有一个5*5的正方形网格,没个格子中有一个大于0且小于4的整数,对于一个确定的局面,若一个格子与它上下左右四个方向的某个格子(如果存在)数字相同,则称这两个格子是连通的,并且这种连通具有传递性。 每次,可以选择一个格子,若与这个格子连通的格子(包括自己)数大于等于3,你就可以选择消掉这个格子,与此同时,与这个格子连通的所有格子会一起消失。 如果仅仅是这样,那就太简单了,因为无论如何消除,最后... 阅读详情

思路来源

https://blog.youkuaiyun.com/wysiwygo/article/details/82710193//原题 poj3041 将问题转化为最小点覆盖

https://blog.youkuaiyun.com/niushuai666/article/details/7036897//如何求最小点覆盖是哪些点

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=36885415//代码实现

题解

part1:

图片来自思路来源第一个网址,感觉说的很好,而且原题既视感.jpg

就像点灯问题,以障碍物代边,以行或列代灯,每盏灯点亮连有它的所有边,即消掉所有障碍物。

问题等价于求哪些点构成一个最小点覆盖。

part2:

寻找具体最小点覆盖,从右边未匹配的点出发模拟找增广路,并标记所有其中所有经过的点,

由于已最大匹配,故不可能再找到增广路,所以一定是以未匹配边出发,最后一条边是已匹配边,二者交替。

遇到几条匹配的边即遇到了几个左边匹配的点,余下的即为右边匹配的点,二者之和即为匹配的点数。

故,左边标记的点(左边的点匹配的边)的存在,导致右边的点未能匹配;

右边匹配的点的存在,导致所有左边的未标记的点不能再找到增广路,二者是对称的。

故,这些点构成一个最小点覆盖。

part3:

代码,代码好坑啊调了若干次。

我们用vis[]数组记录是否被访问,在mincover部分记录是否被标记。

cx、cy数组记录该点匹配的点号。

希望以后自己再见到,能再敲出来。

心得

好几个板子,涉及到一个板子不兼容的问题。

令0-(n-1)号点为u集合,其匹配情况的数组cx[]

n-(n+m-1)号点为v集合,其匹配情况的数组cy[]

连边的时候,对v集合加n,

对于那些一个数组维护的,如vis[],如head[],就用原来的点的标号;

对于那些两个数组维护的,如cx[],cy[],超过n的就减n。

代码

#include <iostream>
#include <algorithm> 
#include <cstring>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#include <functional>
const int INF=0x3f3f3f3f;
const int maxn=1e5+10; 
const int mod=1e9+7;
const int MOD=998244353;
const double eps=1e-7;
typedef long long ll;
#define vi vector<int> 
#define si set<int>
#define pii pair<double,int> 
#define pi acos(-1.0)
#define pb push_back
#define mp make_pair
#define lowbit(x) (x&(-x))
#define sci(x) scanf("%d",&(x))
#define scll(x) scanf("%lld",&(x))
#define sclf(x) scanf("%lf",&(x))
#define pri(x) printf("%d",(x))
#define rep(i,j,k) for(int i=j;i<=k;++i)
#define per(i,j,k) for(int i=j;i>=k;--i)
#define mem(a,b) memset(a,b,sizeof(a)) 
using namespace std;
int head[4005],cnt,n,m,cx[2005],cy[2005];
bool vis[4005];
char tmp[2005];
struct edge{int to,nex,w;}e[200005];
vector<int>x,y;
void init()
{
	cnt=0;
	mem(head,-1); 
}
void add(int u,int v)
{
	e[cnt].to=v;
	e[cnt].nex=head[u];
	head[u]=cnt++;
}
bool dfs(int u)
{
	vis[u]=1;
	for(int i=head[u];~i;i=e[i].nex)
	{
		int v=e[i].to;
		if(!vis[v])
		{
			vis[v]=1;
			if(cy[v-n]==-1||dfs(cy[v-n]))
			{
				cx[u]=v-n;
				cy[v-n]=u;
				return 1;
			}
		}
	}
	return 0;
}
void mincover()
{
	mem(vis,0);
	rep(i,0,n-1)if(cx[i]==-1)dfs(i);
	rep(i,0,n-1)if(!vis[i])x.push_back(i);
	rep(i,n,n+m-1)if(vis[i])y.push_back(i-n);
}
int hungary()
{
	int res=0;
	mem(vis,0);
	mem(cx,-1);
	mem(cy,-1);
	rep(u,0,n-1)
	{
		mem(vis,0);
		res+=dfs(u);
	}
	return res;
} 
void output()
{
    int len1=x.size(),len2=y.size();
    printf("%d",len1);
    rep(i,0,len1-1)printf(" %d",1+x[i]);
    puts("");
    printf("%d",len2);
    rep(i,0,len2-1)printf(" %d",1+y[i]);
}
int main()
{ 
    init();
    sci(n),sci(m);
    rep(i,0,n-1)
    {
    	scanf("%s",tmp);
    	rep(j,0,m-1)
    	{
    		if(tmp[j]=='*')
    		{
    			add(i,n+j);
    			add(n+j,i);
    		}
    	}
    }
    int ans=hungary();
    printf("%d\n",ans);
    mincover();
    output();
	return 0;
}

 

消消乐实验回溯法(深大算法实验3)报告+代码 所有实验的资源 链接: https://pan.baidu.com/s/1lukZRM3Rsd1la35EyyJcvg 提取码: iv72 目录写在前面实验要求求解问题的算法原理描述算法实现的核心伪代码算法测试结果及效率分析回溯法:得分测试回溯法:最大规模回溯法:时间复杂度时间测试回溯法与剪枝回溯法:得分测试时间与得分 分析:图形演示对求解这个问题的经验总结代码消消乐图形演示 写在前面 期末终于算法课快要完结了。 这学期算法课可谓是最难顶的课程了,又正好是线上上课,提问互动的机会相对较少,老师上课抛砖引玉 阅读详情

相关推荐

中科蓝讯AB536X/AB892X芯片开发避坑指南:Downloader配置中那些容易忽略的细节

本文详细解析中科蓝讯AB536X/AB892X芯片开发中Downloader配置的关键细节,包括软开关机实现、触摸灵敏度调试、量产校频等常见问题。特别针对无PR口芯片的替代方案、触摸参数优化、校频流程等易忽略环节提供实用解决方案,帮助开发者规避量产风险,提升开发效率。

weixin_30687051的博客 476

二分匹配与最小点覆盖

先来看看2道最小点覆盖的裸题: POJ3041:题意是给出一个N*N的矩阵,有些格子上有障碍,要求每次消除一行或者一列的障碍,最少消除多少次可以全部清除障碍。做法就是把行和列都看做点,然后障碍物(x,y)就可以看作是x点和y点的边。这样问题就转化成选择最少的边(x,y)使得所有的点都被覆盖。在二分图中,最小点覆盖数=最大匹配数。所以可以用匈牙利算法解决。 代码君: View Code ...

weixin_30897233的博客 93

决策大模型与生成式大模型有何不同?一文拆解技术框架与落地路径

大模型技术正从内容生成走向复杂场景的智能决策。与生成式大模型拟合概率分布不同,决策大模型以序列决策为核心,融合强化学习机制,在动态环境中感知反馈、持续修正行动路径。其技术框架涵盖语义理解、规划推理与闭环决策,并通过世界模型进行低成本仿真推演,显著提升供应链调度、物流排程等场景的应对效率。实际落地时需结合传统优化算法与人工兜底,构建“语义先导+数值寻优”的分层架构,才能平衡精度与稳定性。这篇内容拆解决策大模型的技术组成、落地路径与常见误区,为企业智能化转型提供可参考的实践框架。

weixin_29057163的博客 191

开心消消乐 一道有趣的搜索题 Apare_xzc

开心消消乐 BFS+DFS 2020/10/11 一个朋友问我的,觉得这题还是有点儿意思 题目描述:         给一个n*m(1<=n,m<=10)的格子,每个格子里有一个数字,不同的数字代表颜色不同的方块。每次可以交换相邻的两个方块。 如果有三个或三个以上方块连在一起,那么就可以直接消去这些连载一起的方块。 空白的地方用0表示。问至少交换多少次能使得所有方块都被消去?题目保证有解。 输出最少的交换次数,以及

Apare_xzc的博客 625

告别AT串口线!用STM32F407的USB FS口直连EC800M进行物联网通信

本文介绍了一种创新的物联网通信方案,利用STM32F407的USB FS接口直连EC800M模块,替代传统的AT串口线连接。通过详细的硬件对比、STM32CubeMX配置和USB驱动调试步骤,展示了如何实现更高效的AT指令通信,同时降低硬件复杂度和功耗。

weixin_29189987的博客 707

CDO批量处理nc文件:5分钟搞定CMIP6数据双线性插值(附完整代码)

本文详细介绍了如何使用CDO工具链中的`remapbil`命令,快速实现CMIP6数据的批量双线性插值处理。通过环境配置、核心操作步骤、高级优化技巧及典型报错解决方案,帮助科研人员高效处理大规模nc文件,显著提升气象数据处理效率。

weixin_29267307的博客 294

【牛客网04-15第二次模拟笔试】第一题:01串消消乐

题目之后更新 import java.util.*; /** * @author * @create 2021-04-15 19:34 */ public class Solution1 { static int niumei; static int niuniu; public static void main(String[] args) { Scanner scan = new Scanner(System.in); while (sca

DJames23的博客 657

深入解析fio Benchmark测试:从源码到实践

本文深入解析fio Benchmark测试工具,从入门指南到源码架构分析,详细介绍了其核心模块、关键数据结构和I/O处理机制。通过实战案例展示如何优化存储性能测试,包括内存对齐、多线程调优等技巧,帮助开发者充分利用fio进行精准的存储性能评估。

weixin_42563415的博客 208

牛客练习赛30: D. 消消乐(二分匹配+输出最小点覆盖)

链接:https://ac.nowcoder.com/acm/contest/216/D 来源:牛客网   题目描述 r神在和小b比赛玩一个名为“消消乐”的游戏,在一个n*m的棋盘上,一些棋子分布在格点上,游戏玩家有一个名为超蓝光波的武器,可以消除一行或者一列的所有棋子,使用超蓝光波需要耗费一点能量,消除完所有的棋子之后,花费能量越少得分越高。 r神为了超过排名第一的小b,夺得荣誉称号“天下...

加载中... 756

视频预处理--经典方法卷积3D

在三维卷积操作中,卷积核不仅在空间维度上滑动,还在时间维度上滑动,从而同时捕捉时间和空间上的特征。通过合理设置步长和填充,可以灵活控制输出特征图的大小和特征提取的效果。你的理解非常准确:三维卷积核就像是一个长度为 3 的滑动窗口,每次选取 3 个连续的帧进行卷积操作,而步长和填充则进一步优化了这一过程。

m0_73359068的博客 1649

【机器学习】随机森林(Random Forest,简称 RF):预测光伏电站功率 || 缺失数据处理 || 重复行处理...

【机器学习】随机森林(Random Forest,简称 RF):预测光伏电站功率。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1650

牛客练习赛30 D 消消乐 二分图 最小覆盖

POJ 2226 比这题难一点在于它要求覆盖的行或者列只能覆盖*不能覆盖到.我们同样可以构造二分图,对于原图中的每一个'*'都可以把它当做一条边,连接的是它所在*联通列的最上一点,和它所在*联通行的最左一点这样求出来的最小覆盖的点集中的点 如果在二分图左边的就是覆盖该点所在列,在二分图右边则覆盖该点所在行#include <stdio.h> #include <v...

diandian0511的博客 186

【100%通过率】华为OD机试真题 C 实现【最多等和不相交连续子序列】【2022.11 Q4 新题】

给定一个数组,我们称其中连续的元素为连续子序列,称这些元素的和为连续子序列的和。数组中可能存在几组连续子序列,组内的连续子序列互不相交且有相同的和。求一组连续子序列,组内子序列的数目最多。输出这个数目。

MISAYAONE的博客 1万+

牛客 216D 消消乐 (二分图最小点覆盖)

大意: 给定棋盘, 每次消除一行或一列, 求最小次数使得消除完所有'*'. 裸的二分图最小点覆盖. 二分图的最小点覆盖等于最大匹配, 输出方案时从所有左部未盖点开始标记交替路上的点, 最后左部所有未标记的点加上右部所有标记的点即为最小点覆盖. #include <iostream> #include <sstream> #inclu...

weixin_30838873的博客 193

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

牛客练习赛30 D 消消乐(二分图的最小点覆盖 + 输出覆盖点集)

题意 这道题其实就是二分图的最小点覆盖 + 输出覆盖点集的模板题,和uva11419一样 思路 就是X和YX和YX和Y拆点然后跑一个最小点覆盖,如何输出覆盖的点集呢? 那么我们在计算出最大匹配后,可以从X集合中未匹配的点开始扩展匈牙利树,在Y中被扩展到的点肯定得选,因为只有选择Y中这些点,X中未匹配的点才能被覆盖,而在X中,我们要选那些在扩展中没有被访问过的点,因为这些点是没有与Y中的那些扩展到的...

wjmwsgj的博客 321

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

牛客练习赛30消消乐

r神在和小b比赛玩一个名为“消消乐”的游戏,在一个n*m的棋盘上,一些棋子分布在格点上,游戏玩家有一个名为超蓝光波的武器,可以消除一行或者一列的所有棋子,使用超蓝光波需要耗费一点能量,消除完所有的棋子之后,花费能量越少得分越高。 r神为了超过排名第一的小b,夺得荣誉称号“天下第一”,他需要寻求你的帮助,他希望知道最少需要使用多少次“超蓝光波”,以及在哪行、哪列使用。 主要是第二问吧 二分...

242

计蒜客 15971 腾讯消消乐 题解

计蒜客 15971题解

DarkoDu的博客 831

Java算法题——牛牛消消乐

今天做算法题,遇到了这个题目,随后想把自己的想法写出来。 题目是: “曾经有两次消除的机会摆在我面前,我却没有珍惜……”牛牛回忆道。 牛牛正在玩一款全新的消消乐游戏。这款游戏的主体是由一列列的方块构成,牛牛的目标就是要尽量消除这些方块。 每次操作,牛牛可以选择某个高度 x,将所有高度大于等于 x 的那些列全部消除 x 个方块,随后方块会下落,以填补消除造成的空白。 牛牛这一局的发挥极佳,眼看就要破纪录了,却发现自己只剩下了两次消除机会。 为了不错失这千载难逢的机会,他决定写个程序来算出最优解。 简明题意:

qq_43623970的博客 1730

poj 1027(开心消消乐 模拟 + 搜索)

Total Submissions: 6288   Accepted: 2317 Description The game named "Same" is a single person game played on a 10 \Theta 15 board. Each square contains a ball colored red (R), green (G), o

看起来喜欢做枯燥事情的人或许只是更清楚自己想要什么罢了 1324

NC501 牛牛的消消乐(牛客网)

描述 给定一个数组 nums,其中有 n 个非负整数。你的目的是进行两次操作,使得数组的元素之和最小。 每次操作形如:任选一个整数 x ,将数组中所有大于等于 x 的数减去 x 。 示例1 输入: [2,1,3] 复制返回值: 0 复制说明: 初始数组为[2,1,3]。 先选择 x=2,则所有大于等于 2 的元素减去 2 ,变成[0,1,1]。 再选择 x=1,则所有大于等于 1 的元素减去 1 ,变成[0,0,0]。 所以数组元素之和的最小值为 0。 ...

小白之比白更白的博客 485

CCF201909-5 城市规划【树形DP】(100分题解链接)

试题编号: 201909-5 试题名称: 城市规划 时间限制: 3.0s 内存限制: 512.0MB 问题链接:CCF201909-5 城市规划 问题简述:(略) 问题分析:参考链接都是100分。 程序说明:(略) 参考链接: CCF 201909-5 城市规划(树形dp) CCF 201909-5 城市规划 题记:(略) 100分的C++语言程序如下: ...

海岛Blog 1275

1132F 消消乐

额,一维的消消乐,没有什么特别的地方 我的算法思想有问题,之前做过一个题目,有错误 之前那个题目是说消去一段连续的,得分为length的平方 这次的意思是怎样才能让消去的次数最少 之前的那题用dp[l][r][suc]表示[l,r]区间,前面还有suc个s[l] 这次用dp[l][r]不用表示前面有多少个,反正就一起消掉了 但是都有一个问题,我这次比上次好,但还是出错了 就是对...

qq_41046771的博客 391

2017 Chinese Multi-University Training 1(C(树形dp)+F(置换群循环节)+H(nth_element)+I(仙人掌第k大生成树)+L(组合数学+dfs))

心得 实质上的,第一次三人合作上机 暴露出很多不足,多练才能变强 D(NTT)E(dfs+高维前缀和)G(dfs序)J(生成函数+FFT)待补 思路来源 https://blog.youkuaiyun.com/qq_31759205/article/details/76154626H题 https://blog.youkuaiyun.com/ME495/article/details/76165039I题...

小衣同学的博客 693

回溯法求解消消乐问题

问题描述 《开心消消乐》是一款乐元素研发的三消类休闲游戏。游戏中消除的对象为小动物的头像,包括小浣熊、小狐狸、小青蛙和小鸡等动物头像。玩家通过移动动物头像位置凑够同行/同列3个或3个以上即可消除。 现在定义消消乐规则如下: 1、游戏中共允许K种对象,分布在大小为M×N的格子布局中。 2、交换两个对象位置,凑够3个或3个以上即可消除,被消除的空格由正上方对象掉落填充。 3、可能出现三种消除方式: 同行(列)三个、同行(列)四个、同行(列)五个。分别得分1分、4分、10分。 4、当没有可通过交换消除的对象时,游

weixin_44164489的博客 2993
上一篇: poj2479 Maximum sum(简单dp,连续子段和最大)
下一篇: 牛可乐发红包脱单ACM赛$ C-区区区间间间 (单调栈)
小衣同学
博客等级 码龄9年 1444粉丝 995原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值