图论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;
}
posted @ 2025-08-15 09:51  skyler886  阅读(6)  评论(0)    收藏  举报