DFS可以通过递归实现,也可以通过栈进行实现,BFS则通过队列实现。
对于递归实现的DFS其模板:
int dfs(int u)
{
st[u] = true; // st[u] 表示点u已经被遍历过 更新当前点
for (int i = h[u]; i != -1; i = ne[i]) //扩展当前点
{
int j = e[i]; //用j表示当前扩展后的点
if (!st[j]) dfs(j); //当下一个点还没被遍历过就继续深搜
}
}
栈实现的DFS和队列实现的BFS类似其模板:
queue<int> q;
st[1] = true; // 表示1号点已经被遍历过
q.push(1);
while (q.size())
{
int t = q.front(); //队头
q.pop(); //出队
for (int i = h[t]; i != -1; i = ne[i]) //扩展当前元素
{
int j = e[i]; //用j表示扩展后的点
if (!st[j])
{
st[j] = true; // 表示点j已经被遍历过 即更新点 和队列
q.push(j);
}
}
}
以685.岛屿的最大面积为例
DFS
//dfs
class Solution {
public:
int dx[4] = {1,0,-1,0}, dy[4] = {0,1,0,-1};
int traversal_dfs(vector<vector<int>>& grid, int sr, int sc) {
if (grid[sr][sc] == 0) return 0;
grid[sr][sc] = 0; //当该点是土地就执行下面,并更新当前点
int sum = 1;
for (int i = 0; i < 4; i++) { //扩展新点
int x = sr + dx[i], y = sc + dy[i];
if (x>=0 && x < grid.size() && y >= 0 && y < grid[0].size() && grid[x][y] == 1) {
sum += traversal_dfs(grid,x,y);
}
}
return sum;
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
int rst = 0;
for (int i = 0; i < grid.size(); i++) {
for (int j = 0; j < grid[0].size(); j++) {
if (grid[i][j] == 1) {
rst = max(rst,traversal_dfs(grid,i,j));
}
}
}
return rst;
}
};
BFS
//bfs
class Solution {
public:
int dx[4] = {1,0,-1,0}, dy[4] = {0,1,0,-1};
typedef pair<int,int> PII;
int maxAreaOfIsland(vector<vector<int>>& grid) {
//bfs
queue<PII> q;
int rst = 0;
for (int i = 0; i < grid.size(); i++) {
for (int j =0; j < grid[0].size(); j++) {
int sum = 0;
q.push({i,j});
while (!q.empty()) {
auto t = q.front(); //队头
q.pop(); //出队
if (grid[t.first][t.second] == 0) continue;
grid[t.first][t.second] = 0;
sum++; //更新当前点,标记已走过
for (int k =0; k < 4; k++) { //扩展新点
int x = t.first + dx[k], y = t.second + dy[k];
if (x >= 0 && x < grid.size() && y >=0 && y < grid[0].size() && grid[x][y] == 1) {
q.push({x,y}); //入队
}
}
}
rst = max(rst,sum);
}
}
return rst;
}
};
栈实现的DFS
class Solution {
public:
int dx[4] = {1,0,-1,0}, dy[4] = {0,1,0,-1};
typedef pair<int,int> PII;
int maxAreaOfIsland(vector<vector<int>>& grid) {
stack<PII> st;
int rst = 0;
for (int i = 0; i < grid.size(); i++) {
for (int j =0; j < grid[0].size(); j++) {
int sum = 0;
st.push({i,j}); //先生成一个栈头
while (!st.empty()) {
auto t = st.top(); //栈顶
st.pop(); //出栈
if (grid[t.first][t.second] == 0) continue;
grid[t.first][t.second] = 0; //满足是土地,则访问并更新
sum++;
for (int k =0; k < 4; k++) { //生成新点
int x = t.first + dx[k], y = t.second + dy[k];
if (x >= 0 && x < grid.size() && y >=0 && y < grid[0].size() && grid[x][y] == 1) {
st.push({x,y});
}
}
}
rst = max(rst,sum);
}
}
return rst;
}
};