功能擴展說明:
圖類封裝:將圖數據結構封裝為類,提高代碼復用性
最短路徑查找:基于BFS實現未加權圖的最短路徑查找
路徑重構:通過parent數組回溯構建完整路徑
異常處理:當路徑不存在時返回空向量
復雜度分析:
時間復雜度:O(V + E)
空間復雜度:O(V)
適用場景:
社交網絡中的好友推薦
網頁爬蟲的URL抓取策略
游戲中的AI尋路算法
網絡路由的最短路徑查找
此實現可根據需要進一步擴展為帶權圖的BFS,只需改用優先隊列并考慮權重即可。
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
#include <algorithm>using namespace std;// 圖的鄰接表表示法
class Graph {
private:int V; // 頂點數vector<vector<int>> adj; // 鄰接表public:// 構造函數Graph(int vertices) : V(vertices), adj(vertices) {}// 添加邊(無向圖)void addEdge(int u, int v) {adj[u].push_back(v);adj[v].push_back(u); // 有向圖則去掉這行}// 廣度優先搜索vector<int> BFS(int start) {vector<bool> visited(V, false);vector<int> traversal_order;queue<int> q;visited[start] = true;q.push(start);while (!q.empty()) {int current = q.front();q.pop();traversal_order.push_back(current);// 遍歷所有鄰接節點for (int neighbor : adj[current]) {if (!visited[neighbor]) {visited[neighbor] = true;q.push(neighbor);}}}return traversal_order;}// 查找最短路徑(未加權圖)vector<int> shortestPath(int start, int end) {vector<bool> visited(V, false);vector<int> parent(V, -1);queue<int> q;visited[start] = true;q.push(start);while (!q.empty()) {int current = q.front();q.pop();if (current == end) break;for (int neighbor : adj[current]) {if (!visited[neighbor]) {visited[neighbor] = true;parent[neighbor] = current;q.push(neighbor);}}}// 重構路徑vector<int> path;for (int at = end; at != -1; at = parent[at]) {path.push_back(at);}reverse(path.begin(), path.end());return path[0] == start ? path : vector<int>();}
};int main() {// 創建圖Graph g(6);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 3);g.addEdge(1, 4);g.addEdge(2, 4);// 執行BFScout << "BFS遍歷順序: ";vector<int> traversal = g.BFS(0);for (int node : traversal) {cout << node << " ";}cout << endl;// 查找最短路徑cout << "從0到4的最短路徑: ";vector<int> path = g.shortestPath(0, 4);for (int node : path) {cout << node << " ";}cout << endl;return 0;
}