C++搜索
功能扩展说明:
图类封装:将图数据结构封装为类,提高代码复用性
最短路径查找:基于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);
// 执行BFS
cout << "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;
}