连通块2

题目描述

李老师给定了一个由 m×n​ 个方格组成的迷宫,从左上角编号 ​(1,1) 至右下角编号 (m,n) 。

在所有的方格中,有个特殊的格点 @ ,代表起点,剩余每个格点上标有 . 或 # 的符号,其中 . 代表不能通行,# 代表可以通行。

你的任务:从起点 @ 开始,统计可以经过多少个 # 。

输入格式

第一行两个整数 m 和 n ,且 1≤m,n≤50。

接下来给定一个 m×n 的迷宫,由 . 或 # 或 @ 组成 。

输出格式

一个结果,为从 @ 开始可以通过的 # 的数量。

样例 #1

样例输入 #1

3 4
.##.
.@..
####

样例输出 #1

6
#include <iostream>
#include <queue>
using namespace std;

int n,m,cnt,sx,sy;
char a[51][51];
bool vis[51][51];
int dis[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
struct node
{
	int x,y;
};
queue<node>que;
void bfs()
{
	que.push((node){sx,sy});
	vis[sx][sy]=true;
	while(que.size()>0)
	{
		node t=que.front();
		que.pop();
		//cout<<endl<<t.x<<" "<<t.y<<":";
		for(int i=0;i<4;i++)
		{
			int nx=t.x+dis[i][0];
			int ny=t.y+dis[i][1];
			if(nx<1||nx>n||ny<1||ny>m)
				continue;
			if(vis[nx][ny]||a[nx][ny]=='.')
				continue;
			que.push((node){nx,ny});
			vis[nx][ny]=true;
			cnt++;
			//cout<<nx<<" "<<ny<<" ";
		}
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
			if(a[i][j]=='@')
			{
				sx=i;
				sy=j;
			}
		}
	bfs();
	cout<<cnt;
	return 0;
}

复杂度:O(nm) 

最开始一切正常,样例“仿佛”是对的。但是全WA了,我又研究样例。我发现样例“正确”是因为我把起点算上了,其实是错的。经过一番调试,我发现是判断是否出界时把m写成n了……

<think>嗯,用户问的是连通块计数,我需要先明确这个概念属于哪个数学领域。应该是图论里的内容吧。连通块,也叫连通分量,指的是图中互相连通的最大子图。那连通块计数就是计算一个图中有多少个这样的独立连通部分。 首先,我应该从基本定义入手,解释什么是连通块。可能需要用简单的例子来说明,比如几个孤立的点或者分开的子图。然后,再说明如何计数,比如通过遍历算法,像DFS或BFS,每次遍历一个连通块,统计次数。 接下来,得考虑不同的应用场景,比如社交网络中寻找独立群体,或者电路分析中的连通部件。这样用户能理解实际意义。同时,可能需要提到在不同类型的图中,比如无向图和有向图,连通块的定义是否有差异,比如强连通分量。 还要注意数学表达式的格式要,用户提到行内公式用$...$,独立公式用$$...$$。比如,定义图G=(V,E),顶点集V,边集E,这些可能需要用LaTeX表达。还有连通块的数量可以用变量表示,比如c(G) = 3,这样的例子。 可能用户需要知道具体的算法步骤,比如如何用DFS来计数。这时候要分步骤说明,同时注意不要使用代码,而是用自然语言描述过程。比如从任意未访问的节点出发,标记所有可达节点,计数加一,直到所有节点都被访问。 另外,要确保回答结构清晰,分点解释定义、方法、应用和例子。比如分成几个小节,每个部分用标题突出,但根据用户要,可能不需要用Markdown格式,所以需要用中文自然分段。 还要检查有没有错误的地方,比如连通块是否仅适用于无向图,有向图中的强连通分量是否属于不同的概念。需要明确区分,避免混淆用户。 最后,举一个具体的例子,比如一个图有三个分开的部分,每个部分内部连通,这样连通块计数就是3。或者更具体的数字例子,比如顶点和边的组合,让用户更容易理解。 总结起来,回答需要涵盖定义、计数方法、应用场景和实例,同时注意格式要和语言的准确性。</think>### 连通块计数介绍 #### 1. 基本定义 在图论中,**连通块**(Connected Component)是指一个无向图中满足以下条件的最大子图: - 子图中任意两个顶点之间都存在路径; - 不与其他子图连通。 **连通块计数**即计算一个图中包含的连通块数量。例如,若图中有3个互不连通的子区域,则连通块数量为3。 --- #### 2. 数学表达 - 设图$G=(V,E)$,其中$V$为顶点集合,$E$为边集合。 - 连通块数量可表示为$c(G)$,满足$c(G) = k$($k$为自然数)。 --- #### 3. 计数方法 **核心思想**:通过遍历算法标记所有连通的顶点,每完成一次遍历,计数增加1。 **常用算法**: 1. **深度优先搜索(DFS)** - 从任意未访问的顶点出发,递归访问所有可达顶点,标记为已访问。 - 完成一次DFS后,连通块数加1。 2. **广度优先搜索(BFS)** - 类似DFS,但使用队列按层遍历。 **时间复杂度**:$O(|V| + |E|)$,与顶点数$|V|$和边数$|E|$线性相关。 --- #### 4. 应用场景 - **社交网络分析**:统计独立群体数量。 - **图像处理**:识别图像中的连通区域(如二值图像中的物体分割)。 - **电路设计**:检测电路中的连通元件。 - **网络连通性**:判断互联网中服务器的连通状态。 --- #### 5. 示例 **例1**:简单无向图 - 顶点集合$V = \{A, B, C, D\}$ - 边集合$E = \{(A,B), (C,D)\}$ - 连通块数量$c(G) = 2$(两个连通块:$\{A,B\}$和$\{C,D\}$)。 **例2**:森林结构 - 若图由3棵树组成(树内部连通,树之间无连接),则$c(G) = 3$。 --- #### 6. 扩展:有向图的连通性 对于有向图,需区分: - **强连通分量**:顶点间双向可达的子图。 - **弱连通分量**:忽略边的方向后形成的连通子图。 此时连通块计数需根据具体定义调整方法。 --- ### 总结 连通块计数是图论中分析网络结构的基础工具,通过遍历算法高效实现,广泛应用于数据分析、计算机视觉等领域。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值