圖的BFS與DFS
阿新 • • 發佈:2021-07-02
前言
本部分程式碼的存圖方式為 \(\text{vector}\) 存圖。
它與標準鄰接表差別並不是很大。只是 \(\text{vector}\) 比較好寫。
例題
題目給我們一個有向圖,要求我們求出從一個入度為 \(0\) 的點開始,DFS 和 BFS 的遍歷順序。
請對這個圖分別進行 DFS 和 BFS,並輸出遍歷結果。如果有很多點可以遍歷,請先遍歷編號較小的那個點 (因此你可能需要先排序)。
輸入樣例
8 9
1 2
1 3
1 4
2 5
2 6
3 7
4 7
4 8
7 8
輸出樣例
1 2 5 6 3 7 8 4
1 2 3 4 5 6 7 8
DFS
直接感性理解,深搜即可。無任何難度。
void dfs(ll s)
{
vis[s] = 1;
ans.push_back(s);
for (int i = 0; i < t[s].size(); ++i)
if (!vis[t[s][i]])
dfs(t[s][i]);
}
BFS
關於如何廣搜,這裡我就不再講解。具體可以檢視大佬部落格。
這裡只放程式碼作為參考。
void bfs(ll s) { queue<ll> q; q.push(s); vis[s] = 1; while (!q.empty()) { ll x = q.front(); ans.push_back(x); q.pop(); for (ll i = 0; i < t[x].size(); ++i) { if (!vis[t[x][i]]) { q.push(t[x][i]); vis[t[x][i]] = 1; } } } }