联通块的权:求解网格矩阵中联通块的最大权值

DFS求联通块 题目输入一个m行n列的字符矩阵,只要有两个‘@’相邻就能组成一个联通块,如下面的字符矩阵有2个联通块****@* @@*@*@**@@@@*@@@**@分析将字符矩阵看作一个图,用DFS对图中的字符遍历,从每个’@’出发,遍历’@’周围的字符。每次访问时给该位置打上块标志,表示已访问,从而避免多次访问同一个位置。代码#include<iostream> #include<windows.h> #de 阅读详情

7-10 联通块的权

给出一个大小为n×m的网格矩阵,第i行第j列的单元格的权值为ai,j​。

若某个单元格权值不为0且其上下左右相邻的单元格同样不为0,则其构成一个联通块。

求该矩阵联通块的最大权值。

输入格式:

输入的第一行给出一个整数T——表示测试用例的数量。

接下来对于每一组测试用例,第一行给出两个整数n,m,表示网格矩阵的大小。
接下来n行,每行m个整数ai,j​——表示第i行第j列单元格的权值。

1≤T≤1000

1≤n,m≤1000

0≤ai,j​≤1000

输出格式:

对于每一组测试用例,单独一行输出一个整数——表示该矩阵中联通块的最大权值。

输入样例:

4
3 3
1 2 0
3 4 0
0 0 5
1 1
0
5 5
1 1 1 1 1
1 0 0 0 1
1 0 5 0 1
1 0 0 0 1
1 1 1 1 1
3 3
0 1 1
1 0 1
1 1 1

输出样例:

10
0
16
7

问题描述

给定一个大小为n×m的网格矩阵,每个单元格都有一个权值。如果某个单元格的权值不为0且其上下左右相邻的单元格同样不为0,则这些单元格构成一个联通块。我们需要找到矩阵中所有联通块的最大权值之和。

解题思路

这个问题可以通过广度优先搜索(BFS)或深度优先搜索(DFS)来解决。我的解法采用了BFS算法,具体步骤如下:

  1. ​​初始化​​:读取输入数据,包括网格矩阵的大小和每个单元格的权值。
  2. ​​遍历网格​​:对于每个未被访问过且权值大于0的单元格,启动BFS搜索。
  3. ​​BFS搜索​​:从当前单元格出发,探索其上下左右的相邻单元格,将符合条件的单元格加入队列,并累加它们的权值。
  4. ​​记录最大值​​:在每次BFS结束后,比较当前联通块的权值和与已知的最大值,更新最大值。
  5. ​​输出结果​​:处理完所有测试用例后,输出每个测试用例的最大联通块权值。

关键点分析

  • ​​BFS算法​​:适合处理网格中的联通块问题,能够有效地探索所有相连的单元格。
  • ​​访问标记​​:使用一个标记数组D来记录哪些单元格已经被访问过,避免重复计算。
  • ​​边界检查​​:在探索相邻单元格时,需要检查是否超出网格边界。
  • ​​最大值更新​​:在每次BFS过程中实时更新当前联通块的权值和,并与全局最大值比较。

复杂度分析

  • ​​时间复杂度​​:O(n×m),因为每个单元格最多被访问一次。
  • ​​空间复杂度​​:O(n×m),用于存储网格矩阵和访问标记数组。

 

代码实现

#include<bits/stdc++.h>
using namespace std;
#define int long long
int b,c;
int C[1005][1005];
int D[1005][1005];
int xx[4]={0,1,0,-1};
int yy[4]={1,0,-1,0};
int snum=0;
int num;

struct node{
    int x,y;
}now,nextt;

void bfs(int x,int y)
{
    queue<node>q;
    now.x=x;
    now.y=y;
    q.push(now);
	D[x][y]=1;	
	num+=C[x][y];
	C[x][y]=0;
	snum=max(snum,num);
	while(!q.empty())
    { 
        now=q.front();
        q.pop();
    for(int i=0;i<4;i++)
	{
		int y1=now.y+yy[i];
	    int x1=now.x+xx[i];
		if(y1>0&&y1<=c&&x1>0&&x1<=b)
		{	
			if(D[x1][y1]==0&&C[x1][y1]>0)
			{
                D[x1][y1]=1;
                num += C[x1][y1];
                C[x1][y1]=0;
                 snum=max(snum,num);
                nextt.x=x1;
                nextt.y=y1;
				q.push(nextt);
			}
		}
		
	    }
    }
	
}
signed main()
{
	int a;
	cin>>a;

	while(a--)
	{
		snum=0;
		cin>>b>>c;
		for(int i=1;i<=b;i++)
		{
			for(int j=1;j<=c;j++)
			{
				cin>>C[i][j];
				D[i][j]=0;
			}
		}
		for(int i=1;i<=b;i++)
		{
			for(int j=1;j<=c;j++)
			{
				if(C[i][j]>0&&D[i][j]==0)
				{
					num=0;
					bfs(i,j);
				}
			}
		} 
		
		cout<<snum<<endl;
	}
	return 0;
}

总结

希望这篇博客能够帮助大家理解如何用BFS解决联通块问题。如果有任何疑问或建议,欢迎在评论区留言讨论。

连通块(c++) 进行深度优先搜索的次数就是图中的连通块个数,如果我们在每次进行深度优先搜索时,对访问过的点进行不同的标记,就可以记录每个连通块内的顶点有哪些了,也可以跟迷宫问题时一样求解连通块大小,最大连通块等问题。其实之前在迷宫问题的时候,我们谈过连通块,这两个概念其实是一样的,正如本章最开始所说,我们可以把迷宫画成一般的图的样子,而且画出来就是无向图。在无向图上,我们可以利用 DFS 可以求连通块的数量。形象一点说,一个连通块就是一些能互相到达的点形成的图上的一块。在迷宫上的连通块也就是在这个图上的连通块。 阅读详情

相关推荐

【信息科学与工程学】【通信工程】第七十九篇 网络规划中的方案中的数学建模01

编号学科网络领域产品核心知识点与数学方程式在网络设计中的详细作用理论/工程依据 关联知识和法律法规1概率论与数理统计​流量工程与负载均衡​路由器、交换机、SDN控制器核心知识点:​ 排队论 方程式:​ M/M/1队列平均等待时间 W=μ(μ−λ)λ​ 变量定义:​ λ = 平均到达率 (packets/s), μ = 平均服务率 (packets/s) 单位:​ packets/s, s 数值设计:​ 需满足 ρ=λ/μ<1 以保证队列稳定。 推导要点:​ 基于泊松到达过程与指

weixin_49199313的博客 326

DFS入门(连通块)

总的来说,连通块中dfs充当的是标记地盘的作用,判断当前点,进行dfs(继续往下搜索)

m0_72677274的博客 6020

【对比学习+分割】CRIS:CLIP驱动RIS图像分割(CVPR 2022)

CRIS: CLIP-Driven Referring Image Segmentation

这个博客太懒了什么都没说 3324

连通块|c++基础--详细讲解

连通块其实就是求相邻格子的数量、有几块......通常用深度优先搜索来编写。

署髫 1167

逆向工程师必备:用MDL绕过游戏保护读取内存数据的完整流程(附POC代码)

本文深入探讨了内核级内存访问技术,重点介绍了如何利用MDL(Memory Descriptor List)机制稳定、隐蔽地绕过游戏反作弊系统读取进程内存。通过对比MmCopyVirtualMemory等方法的优劣,提供了完整的MDL映射实战代码与反检测策略,为逆向工程师在内核态进行安全内存操作提供了专业指导。

weixin_29227425的博客 623

Codesys 3.5报警功能配置保姆级教程:从变量定义到确认方式(含REF/ACK详解)

本文详细介绍了Codesys 3.5报警功能的配置流程,从变量定义到确认方式的选择,特别解析了REF和ACK两种确认方式的底层逻辑。通过实战案例和代码示例,帮助工程师快速掌握报警系统的搭建与调试技巧,提升工业自动化项目的可靠性。

weixin_29245767的博客 458

“ 一条路走到黑,不撞南墙不回头”——C++【DFS(深度优先搜索算法)】入门讲解

DFS(Depth First Search)简称“深搜”,是个得分利器。正如标题所述,这个算法的特点就是:一条路走到黑,不撞南墙不回头。通俗地说,即在遍历时,优先选择一条路,往搜索树的深层遍历,当不能继续深入时则返回上一层,选择另一个岔路遍历。深度优先搜索按照深度优先的方式进行搜索,通俗点说就是 〃一条路走到黑〃。注意,这里的 〃搜索〃是一种穷举的方式,把所有可行的方案都列出来,不断去尝试,直到找到问题的解。深度优先搜索和递归的区别是:深度优先搜索是一种算法,注重的是思想;

AmyZhangXiwen的博客 2206

CSP-J 复试考点

可以用来训练思维,对于学习时间短的同学,动态规划可以帮助你迅速进入编程状态,也有助于帮你发现题目背后可能隐藏的更简便的算法。动态规划、贪心都是和子问题相关的,动态规划的基本思想是将一个大的问题划分成子问题,接着分别求解,而且能够将一些重复的计算记忆化,大大提高效率。难度加大,会涉及到二分、动态规划之类的算法,容易遗漏考虑点,不易得全分,考试的时候要注意全面性。一般是压轴题,算法不明显,剪枝的搜索、动态规划、状压 DP、树形 DP 、树、图等。枚举算法是指,列举出所有可能的取值,从中找出最优解。

GuanHeTian的博客 2214

联通块的使用

【代码】联通块的使用和技巧

a360070488的博客 184

自动驾驶仿真:Carsim、NI和VTD联合仿真课题二

文章目录前言一、设备配置1、硬件需求2、网络配置二、Carsim工程配置1、创建工程2、创建数据库3、参数配置三、VTD工程配置1、创建工程四、Veristand工程配置1、创建工程五、运行程序 前言 上篇文章《Carsim、NI和VTD联合仿真课题一》简单地介绍了三者之间的联合框架,以及NI与VTD之间简单的组包与拆包指导。这篇文章将要讲述的是如何将三个软件联合起来,如何设置软件参数,用最简单的方法把仿真车开起来。 一、设备配置 1、硬件需求 注:真正的做智能驾驶仿真项目,至少需要两台电脑,一台实时机

zataji的博客 1万+

数据库课程案例——电力公司收费管理系统分析与实践,完整带SQL语句

某电力公司收费管理信息系统实现客户信息、用电类型(类别号、类别名、电价)及业务员管理;实现客户用电信息管理(客户号、月份、用电类别号、用电度数);实现客户费用管理(客户号、月份、费用、收费标志),收费标志的默认值为“未收”;实现收费登记(客户、月份、应收费用、实收费用、业务员),并自动修改收费标志(用触发器实现);创建触发器,实现收费时自动更加应收费用和实收费用,计算本次结余,然后修改客户信息表中的结余金额;创建存储过程统计指定月份应收费用和实收费用;创建存储过程查询指定月份未交费的用户信息,以便崔费;创建

qq_44242804的博客 2761

C++ | 用DFS和BFS实现联通块问题——可解最短路径

对于蓝色的小块而言,四联通块(题目不说一般都是四联通)就是周围红色的区域,是可到达的位置,八联通块是加上黄色的位置。

lly18435759909的博客 843

小麦病害检测系统开发

本项目旨在针对小麦病害小目标检测任务,在YOLOv11基础上进行三项改进: - 将主干网络替换为Swin Transformer,增强全局特征提取能力。 - 在检测头中引入DynamicHead,并增加检测头数量至四个,提升多尺度检测性能。 - 集成半监督FixMatch训练框架,利用无标签数据提升模型泛化能力。 我们定义五个模型进行对比实验: - Model 0: 原始YOLOv11 (有监督) - Model 1: YOLOv11 + Swin Transformer (有监督) ~~~~~~

AI的内部世界的博客 119

一道建图题

题意 你有一个 n×mn\times mn×m 的矩阵,要求每对四联通的相邻格子的和不小于一个值。 最小化所有格子上数字之和,输出方案。 n≤4,m≤106n\leq 4,m\leq 10^6n≤4,m≤106 首先考虑最小化所有格子上数字之和ansansans: 这里有一个结论:如果把每个输入的限制看做带有权值的边,每个格子看成一个结点,那么ansansans=这个图的最大匹配(网格图显然是二分...

xiayuyang 268

Ut接口原理及 VoLTE 补充业务自管理信令流程(GBA 引导认证+业务访问认证+ VoLTE 补充业务自管理)

2. Ut 接口及 VoLTE 业务子管理概述 2.1 UT 接口 —— VoLTE 终端补充业务配置 2.2终端通过 Ut 接口完成 VoLTE 补充业务自管理举例 2.3什么是 GBA 和 GAA 架构 2.4为什么要引入 GBA 架构认证及 BSF 网元 2.5UE(终端) 接口相关网元及功能 2.6GBA 架构流程概述 3. Ut 接口业务自管理信令流程 3.1 补充业务自管理及本文主要参考以下规范 3.2 Ut 接口业务自管理信令流程:查询补充业务 3.2.1 UE获

原来45的博客 1255

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

基于边缘匹配的碎纸片自动拼接复原:从图像预处理到全局优化

图像处理是计算机视觉的基础领域,其核心目标是通过算法对数字图像进行分析、增强和理解。其中,图像匹配与拼接技术通过计算图像间的相似性,实现多视角图像的融合或破损图像的复原,在司法取证、文档数字化和考古修复中具有重要价值。本文聚焦于碎纸片自动拼接这一经典问题,深入探讨了基于边缘匹配的核心原理。通过图像预处理(如二值化、去噪)、边缘特征向量化(结合差分特征与投影直方图)以及相似度计算(如归一化互相关),构建了高效的匹配引擎。针对全局优化,文章分析了从贪婪匹配到基于图模型求解等多种策略,并分享了处理空白区域误匹配、

weixin_34297704的博客 470

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

经典联通块问题——使用 Flood—Fill算法解决

下面使用深度优先搜索来解决本题:

2301_79363050的博客 471

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

1335:【例2-4】连通块

一个n × m的方格图,一些格子被涂成了黑色,在方格图中被标为1,白色格子标为0。问有多少个四连通的黑色格子连通块。四连通的黑色格子连通块指的是一片由黑色格子组成的区域,其中的每个黑色格子能通过四连通的走法(上下左右),只走黑色格子,到达该联通块中的其它黑色格子。第一行两个整数n,m(1≤n,m≤100),表示一个n × m的方格图。接下来n行,每行m个整数,分别为0或1,表示这个格子是黑色还是白色。一行一个整数ans,表示图中有ans个黑色格子连通块。

LBZ的博客 707

岛屿数量-DFS联通块问题(另附一道很有坑点的DFS题)

经典联通块,既可以将走过的路标记为1,也可以直接改为’0’

m0_51305283的博客 1148

基环图 && 求联通块个数

图论

jyyyyx的算法之旅 741

1596联通块

/你找到一个没走过的空格就填上水dfs会使那个联通的坑都是。//存状态:有没有被淹过。//连通块和迷宫不一样有八个方向。//水但是又有一个循环就能计算坑。

m0_73222441的博客 300

连通块--队列bfs基础打法--详细版解析(适用初学者)--题源:《CCF中学生计算机程序设计基础篇》

像我这样的初学者刚刚上手队列和bfs哪怕是基础版也不是很容易懂,所以我给这题做了个详解。

keepstrivingchy的博客 3305

连通块(信息学奥赛一本通-T1335)

【题目描述】 一个n * m的方格图,一些格子被涂成了黑色,在方格图中被标为1,白色格子标为0。问有多少个四连通的黑色格子连通块。四连通的黑色格子连通块指的是一片由黑色格子组成的区域,其中的每个黑色格子能通过四连通的走法(上下左右),只走黑色格子,到达该联通块中的其它黑色格子。 【输入】 第一行两个整数n,m(1≤n,m≤100),表示一个n * m的方格图。 接下来n行,每行m个整数,...

Alex_McAvoy的博客 5465

DFS:floodfill算法解决矩阵联通块问题

floodfill,翻译为洪水灌溉,而floodfill算法本质上是为了解决在矩阵中性质相同的联通块问题。

weixin_51142926的博客 3262

牛客周赛52--E小红的图上加边(联通块)

来源:牛客网。

2301_80718054的博客 840

联通块中点的数量——并查集

【代码】联通块中点的数量——并查集。

2301_79363050的博客 403
上一篇: 7-10 模拟炸弹人题解
下一篇: L2-2 病毒溯源--寻找最长变异链
loopdeloop
博客等级 码龄4年 219粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值