用DFS(深度優先遍歷)解決可達性 連通性問題

2021-09-03 08:39:00 字數 1514 閱讀 5495

解題思路:從乙個節點出發,使用 dfs 對乙個圖進行遍歷時,能夠遍歷到的節點都是從初始節點可達的,每趟從初始節點開始,需要把可以到達的位置做標記,並且標記後不需要更改,當走不通時返回,再尋找下乙個節點進行遍歷。

leetcode上典型題目應用:

695 查詢最大的連通面積

200 矩陣中的連通分量數目

695 查詢最大的連通面積

[[0,0,1,0,0,0,0,1,0,0,0,0,0],

[0,0,0,0,0,0,0,1,1,1,0,0,0],

[0,1,1,0,1,0,0,0,0,0,0,0,0],

[0,1,0,0,1,1,0,0,1,0,1,0,0],

[0,1,0,0,1,1,0,0,1,1,1,0,0],

[0,0,0,0,0,0,0,0,0,0,1,0,0],

[0,0,0,0,0,0,0,1,1,1,0,0,0],

[0,0,0,0,0,0,0,1,1,0,0,0,0]]

在每個入口節點遍歷完成後進行比較獲得最大面積

private int m, n;

private int direction = , , , };

public int maxareaofisland(int grid)

m = grid.length;

n = grid[0].length;

int maxarea = 0;

for (int i = 0; i < m; i++)

}return maxarea;

}private int dfs(int grid, int r, int c)

grid[r][c] = 0;

int area = 1;

for (int d : direction)

return area;

}

200 矩陣中的連通分量數目

輸入:11000

11000

00100

00011

輸出: 3

在每個節點遍歷完成後計數加1,得到連通數目

private int m, n;

private int direction = , , , };

public int numislands(char grid)

m = grid.length;

n = grid[0].length;

int islandsnum = 0;

for (int i = 0; i < m; i++) }}

return islandsnum;

}private void dfs(char grid, int i, int j)

grid[i][j] = '0';

for (int d : direction)

}

變種題目:

547 好友關係的連通分量數目

130 填充封閉區域

417 能到達的太平洋和大西洋的區域

深度優先遍歷DFS

本文章 中的圖用鄰接矩陣來表示,所以演算法複雜度為o v 2 如果用鄰接表來表示,那麼演算法的複雜度為o v e dfs可用來判斷圖中是否有環,展現無向圖中的連通分支。通過dfs,形成乙個由多棵深度優先樹所組成的深度優先森林。將原先圖中的邊新增到該森林之後,可以將所有邊定義為以下四類 1.樹邊 森林...

深度優先遍歷(DFS)

深度優先搜尋是一種列舉所有完整路徑以遍歷所有情況的搜尋方法。使用遞迴可以很好的實現深度優先遍歷,因此,只能說遞迴是實現深度優先遍歷的一種實現方式。給定乙個序列,列舉這個序列所有的子串行 例如子串行包含,選擇最優子串行,使它的某個特徵是所有子串行中最優的。這個問題也就是從n個整數中,選擇k個數的所有方...

用DFS(廣度優先遍歷)解決排列問題

例如有 三個字元,求解所有由這三個字元排列得到的字串。解題思路 一次排列中已經遍歷過的元素不能重複遍歷,因此需要對新增過的元素進行標記,避免本次排列出現重複。這種問題在一次排列求解完成之後還需要繼續求解,在本次排列結束後,為了保證已經訪問過但是不在當前遞迴鏈中的元素可以繼續被訪問,需要對這個元素取消...