代码随想录–图论部分
day 51 图论第二天
一、卡码网99–岛屿数量
代码随想录题目链接:代码随想录
给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。
没太看懂教程的解法,所以这里是自己的做法
正常把图存进来,遍历,当遍历到元素为1的地方,在这里做深度搜索
搜什么?搜这个元素周围是1的元素块,把它们都改为0,这样就不用担心后续遍历重复计数
搜索结束后,接着遍历,就可以了
代码如下:
#include <iostream>
#include <vector>
using namespace std;
int result = 0;
void dfs(vector<vector<int>> & graph, int i, int j)
{
int rows = graph.size();
int cols = graph[0].size();
if(i < 0 || j < 0 || i >= rows || j >= cols || !graph[i][j]) return;
graph[i][j] = 0;
dfs(graph, i - 1, j);
dfs(graph, i + 1, j);
dfs(graph, i, j - 1);
dfs(graph, i, j + 1);
}
int main()
{
int N,M;
cin >> N >>M;
vector<vector<int>> graph(N, vector<int>(M, 0));
for(int i = 0; i < N; i ++)
for(int j = 0; j < M; j ++)
cin >> graph[i][j];
for(int i = 0; i < N; i ++)
for(int j = 0; j < M; j ++)
{
if(graph[i][j] == 1)
{
result ++;
dfs(graph, i, j);
}
}
cout << result << endl;
}
另外地,可以改为广度优先搜索,在本题中也就是一圈一圈往外搜索,每一圈都要记录下来后续要遍历的位置
只需要改dfs
函数为bfs
,其他都不需要动
void bfs(vector<vector<int>> & graph, int i, int j)
{
int rows = graph.size();
int cols = graph[0].size();
queue<pair<int, int>> q;
q.push({i,j});
graph[i][j] = 0;
while(!q.empty())
{
pair<int, int> curr = q.front();
q.pop();
vector<pair<int, int>> directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
for(auto ele : directions)
{
int x = curr.first + ele.first;
int y = curr.second + ele.second;
if(x >= 0 && y >= 0 && x < rows && y < cols && graph[x][y])
{
graph[x][y] = 0;
q.push({x, y});
}
}
}
}
二、卡码网100–岛屿的最大面积
代码随想录题目链接:代码随想录
给定一个由 1(陆地)和 0(水)组成的矩阵,计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。
没什么好说的,和上面的题基本一样,额外的用一个int记录每次搜索结束的面积,比较即可
代码如下:
#include <iostream>
#include <vector>
using namespace std;
int result = 0;
int curr = 0;
void dfs(vector<vector<int>> & graph,int i,int j)
{
int rows = graph.size();
int cols = graph[0].size();
if(i < 0 || j < 0 || i >= rows || j >= cols || !graph[i][j]) return;
curr ++;
graph[i][j] = 0;
dfs(graph, i - 1, j);
dfs(graph, i + 1, j);
dfs(graph, i, j - 1);
dfs(graph, i, j + 1);
}
int main()
{
int N,M;
cin >> N >> M;
vector<vector<int>> graph(N, vector<int>(M, 0));
for(int i = 0; i < N; i ++)
for(int j = 0; j < M; j ++)
cin >> graph[i][j];
for(int i = 0; i < N; i ++)
for(int j = 0; j < M; j ++)
{
if(graph[i][j] == 1)
{
curr = 0;
dfs(graph, i, j);
result = result > curr ? result : curr;
}
}
cout << result << endl;
}