1. DFS深度優先演算法
/*
- 深度優先演算法
DFS 從起始節點出發,沿著一條路徑儘可能深入地訪問每個節點,直到無法繼續時再回退,尋找未訪問的節點。
- 使用遞迴實現。
*/
#include <iostream>
#include <vector>
using namespace std;
void DFS(int node, vector<vector<int>>& graph, vector<bool>& visited) {
visited[node] = true; // 標記當前節點為已訪問
cout << node << " "; // 輸出當前節點
for (int neighbor : graph[node]) { // 遍歷當前節點的所有鄰居節點
if (!visited[neighbor]) { // 如果鄰居節點未被訪問
DFS(neighbor, graph, visited);// 遞迴呼叫DFS訪問該鄰居節點
}
}
}
int main() {
vector<vector<int>> graph = {
{1, 2}, {0, 3, 4}, {0}, {1}, {1} // 鄰接表表示的圖
};
vector<bool> visited(graph.size(), false); // 初始化訪問標記陣列,全部為 false
cout << "DFS: ";
DFS(0, graph, visited); // 從節點 0 開始 DFS
return 0;
}
2. BFS廣度優先演算法
/*
- 廣度優先演算法
BFS 從起始節點出發,逐層訪問相鄰節點。先訪問起始節點,再訪問其所有鄰居節點,然後逐層擴充套件。
- 使用佇列實現。
*/
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
void BFS(int start, vector<vector<int>>& graph,vector<bool> &visited) {
queue<int> q;
visited[start] = true; // 標記起始節點為已訪問
q.push(start); // 將起始節點加入佇列
while (!q.empty()) { // 當佇列非空時
int node = q.front(); // 獲取佇列首節點
q.pop(); // 移除佇列首節點
cout << node << " "; // 輸出當前節點
for (int neighbor : graph[node]) { // 遍歷當前節點的所有鄰居節點
if (!visited[neighbor]) { // 如果鄰居節點未被訪問
visited[neighbor] = true; // 標記鄰居節點為已訪問
q.push(neighbor); // 將鄰居節點加入佇列
}
}
}
}
int main() {
vector<vector<int>> graph = {
{1, 2}, {0, 3, 4}, {0}, {1}, {1} // 鄰接表表示的圖
};
vector<bool> visited(graph.size(), false); // 初始化訪問標記陣列
cout << "BFS: ";
BFS(0, graph,visited); // 從節點 0 開始 BFS
return 0;
}