算法训练1-day43-图论

25 阅读2分钟
  1. 99. 计数孤岛 熟悉dfs和bfs,注意边界条件
#include <iostream>
#include <queue>
#include <string>
#include <vector>

using namespace std;

int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};

void bfs(vector<vector<int>> &grid, vector<vector<bool>> &visited, int i,
         int j) {
  queue<pair<int, int>> q;
  q.push(make_pair(i, j));

  while (!q.empty()) {
    pair<int, int> pos = q.front();
    q.pop();
    i = pos.first;
    j = pos.second;
    for (auto d : dir) {
      int next_i = i + d[0];
      int next_j = j + d[1];
      // 越界
      if (next_i < 0 || next_i >= grid.size() || next_j < 0 ||
          next_j >= grid[0].size()) {
        continue;
      }
      if (!visited[next_i][next_j] && grid[next_i][next_j] == 1) {
        visited[next_i][next_j] = true;
        q.push(make_pair(next_i, next_j));
      }
    }
  }
}

void dfs(vector<vector<int>> &grid, vector<vector<bool>> &visited, int i,
         int j) {
  for (auto d : dir) {
    int next_i = i + d[0];
    int next_j = j + d[1];
    // 越界
    if (next_i < 0 || next_i >= grid.size() || next_j < 0 ||
        next_j >= grid[0].size()) {
      continue;
    }
    if (!visited[next_i][next_j] && grid[next_i][next_j] == 1) {
      visited[next_i][next_j] = true;
      dfs(grid, visited, next_i, next_j);
    }
  }
}

int main() {
  int n = 0, m = 0;
  cin >> n >> m;
  vector<vector<int>> grid(n, vector<int>(m, 0));

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> grid[i][j];
    }
  }

  vector<vector<bool>> visited(n, vector<bool>(m, false));

  int result = 0;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      if (!visited[i][j] && grid[i][j] == 1) {
        ++result;
        visited[i][j] = true;
        // bfs(grid, visited, i, j);
        dfs(grid, visited, i, j);
      }
    }
  }

  cout << result;

  return 0;
}
  1. [100. 最大岛屿的面积]](kamacoder.com/problempage…) 和上一道题类似,再遍历的过程中记录一下岛屿的大小即可
#include <iostream>
#include <queue>
#include <vector>

using namespace std;

int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
void dfs(vector<vector<int>> &grid, vector<vector<bool>> &visited, int i, int j,
        int &maxTemp) {
  for (auto d : dir) {
    int next_i = i + d[0];
    int next_j = j + d[1];
    if (next_i < 0 || next_i >= grid.size() || next_j < 0 ||
        next_j >= grid[0].size()) {
      continue;
    }
    if (!visited[next_i][next_j] && grid[next_i][next_j] == 1) {
      visited[next_i][next_j] = true;
      maxTemp++;
      dfs(grid, visited, next_i, next_j, maxTemp);
    }
  }
}

int main() {
  int n, m;
  cin >> n >> m;

  vector<vector<int>> grid(n, vector<int>(m, 0));
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      cin >> grid[i][j];
    }
  }

  vector<vector<bool>> visited(n, vector<bool>(m, false));
  int maxVal = 0;
  int maxTemp = 0;

  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      if (!visited[i][j] && grid[i][j] == 1) {
        maxTemp = 1;
        visited[i][j] = true;
        dfs(grid, visited, i, j, maxTemp);
        maxVal = max(maxVal, maxTemp);
      }
    }
  }

  cout << maxVal;

  return 0;
}