图论02
99. 岛屿数量
dfs:
#include <iostream>
#include <vector>
using namespace std;
int result = 0;
vector<vector<int>> dirt = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
void dfs(vector<vector<int>> &map, int &x, int &y, vector<vector<int>> &visited, const int &n, const int &m) {
for (int k = 0; k < 4; k++) {
int nx = x + dirt[k][0];
int ny = y + dirt[k][1];
if (nx >= n || ny >= m || nx < 0 || ny < 0) {
continue;
}
if (map[nx][ny] == 1 && !visited[nx][ny]) {
visited[nx][ny] = 1;
dfs(map, nx, ny, visited, n, m);
}
}
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> map(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> map[i][j];
}
}
vector<vector<int>> visited(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (visited[i][j] != 1 && map[i][j] == 1) {
visited[i][j] = 1;
result++;
dfs(map, i, j, visited, n, m);
}
}
}
cout << result;
return 0;
}
bfs:
void bfs(vector<vector<int>> &map, int &x, int &y, vector<vector<int>> &visited, const int &n, const int &m) {
queue<pair<int, int>> que;
que.push({x, y});
while(!que.empty())
{
pair<int, int> cur = que.front();
que.pop();
int curx = cur.first, cury = cur.second;
for (int k = 0; k < 4; k++) {
int nx = curx + dirt[k][0];
int ny = cury + dirt[k][1];
if (nx >= n || ny >= m || nx < 0 || ny < 0) {
continue;
}
if (map[nx][ny] == 1 && !visited[nx][ny]) {
visited[nx][ny] = 1;
que.push({nx, ny});
}
}
}
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> map(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> map[i][j];
}
}
vector<vector<int>> visited(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (visited[i][j] != 1 && map[i][j] == 1) {
visited[i][j] = 1;
result++;
bfs(map, i, j, visited, n, m);
}
}
}
cout << result;
return 0;
}
100. 岛屿的最大面积
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int dirt[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};
int n, m;
int maxArea = 0;
int bfs(vector<vector<int>> &grid, vector<vector<int>> &visited, int &x, int &y) {
int count = 1;
queue <pair<int, int>> que;
que.push({x, y});
while (!que.empty()) {
pair<int, int> cur = que.front();
que.pop();
int curx = cur.first, cury = cur.second;
for (int i = 0; i < 4; i++) {
int nx = curx + dirt[i][0];
int ny = cury + dirt[i][1];
if (nx < 0 || nx >= (int)grid.size() || ny < 0 || ny >= (int)grid[0].size())
continue;
if (grid[nx][ny] == 1 && !visited[nx][ny]) {
que.push({nx, ny});
visited[nx][ny] = 1;
count++;
}
}
}
return count;
}
int main() {
cin >> n >> m;
vector<vector<int>>grid(n, vector<int>(m, 0));
vector<vector<int>>visited(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> grid[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 1 && !visited[i][j]) {
visited[i][j] = 1;
int count = bfs(grid, visited, i, j);
maxArea = max(maxArea, count);
}
}
}
cout << maxArea;
return 0;
}

浙公网安备 33010602011771号