Offer68題 Day3 兩個基礎演算法

itsinsane發表於2024-10-29

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;
}

相關文章