求连通块数量模板 (BFS)

连通块模板(BFS)

大致思路就是选中一个点然后向四周拓展并标记,如果不能拓展了就为一个块,最后输出个数即可

#include<iostream>
#include<queue> // 利用队列存储数据
using namespace std;
int n, m, cnt ; // 全局变量默认为0
int arr[105][105] ;
int book[105][105] ;
int dx[] = {-1, 0, 1, 0} ; // 利用两个一维数组来表示四个方向
int dy[] = {0, 1, 0, -1} ;
struct node 
{
	int x ;
	int y ;
};
queue<node> qu ;  // 建立一个存放结构体的队列
void bfs(int x1, int y1) // 传入起点坐标
{
	node a = {x1, y1} ;
	qu.push(a) ; // 把起点存入队首
	while (!qu.empty()) //队列非空是循环条件
	{
		node b = qu.front() ; // 取出队首
		qu.pop() ; // 去掉队首
		for (int i = 0 ; i < 4 ; i++) { // 利用循环遍历四个方向
			int nx = b.x + dx[i] ;
			int ny = b.y + dy[i] ;
			if (nx < 0 || nx > n - 1 || ny < 0 || ny > m - 1) continue ; // 判断边界
			if (arr[nx][ny] == 0 && book[nx][ny] == 0) { 
				book[nx][ny] = 1 ; // 把可拓展的地方标记起来
				node c = {nx, ny} ;
				qu.push(c) ;
			} // 如果四周没有可以拓展的地方,就会不断弹出队首,直到队列为空跳出循环
		}
	}	
}
int main(void)
{
	cin >> n >> m ;
	for(int i = 0 ; i < n ; i++) { // 读入二维数组
 		for (int j = 0 ; j < m ; j++) {
 			cin >> arr[i][j] ;
 		}
	}
	for (int i = 0 ; i < n ; i++) {
		for (int j = 0 ; j < m ; j++) {
			if (arr[i][j] == 0 && book[i][j] == 0) { // 寻找到可拓展却没被标记的作为起点
				cnt++ ;
				bfs(i, j) ;
			}
		} // 如果有多个样例记得将数组进行重置 
	} // 代码为: memset(arr, 0, sizeof(arr)) 在头文件<cstring>中,把数组重置为全为0
	cout << cnt << endl ;
	return 0 ;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!下面是一个基本的BFS(广度优先搜索)代码模板C++实现: ```cpp #include <iostream> #include <queue> #include <vector> using namespace std; void bfs(vector<vector<int>>& graph, int start) { int n = graph.size(); vector<bool> visited(n, false); // 记录节点是否被访问过 queue<int> q; // 用于存储待访问的节点 visited[start] = true; q.push(start); while (!q.empty()) { int node = q.front(); q.pop(); // 处理当前节点 cout << node << " "; // 遍历当前节点的邻居节点 for (int neighbor : graph[node]) { if (!visited[neighbor]) { visited[neighbor] = true; q.push(neighbor); } } } } int main() { // 构建图的邻接表表示 vector<vector<int>> graph = { {1, 2}, // 节点0的邻居节点为1和2 {0, 3, 4}, // 节点1的邻居节点为0、3和4 {0, 5}, // 节点2的邻居节点为0和5 {1}, // 节点3的邻居节点为1 {1}, // 节点4的邻居节点为1 {2} // 节点5的邻居节点为2 }; int startNode = 0; // 从节点0开始进行BFS bfs(graph, startNode); return 0; } ``` 这个代码模板使用了邻接表来表示图,通过队列来实现BFS。首先,我们创建一个`visited`数组来记录节点是否被访问过,初始时所有节点都未被访问。然后,我们创建一个队列`q`,将起始节点加入队列,并将其标记为已访问。接下来,我们进入循环,直到队列为空。在每次循环中,我们取出队列的头部节点,并处理该节点。然后,我们遍历该节点的邻居节点,如果邻居节点未被访问过,则将其加入队列并标记为已访问。最终,当队列为空时,BFS结束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值