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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值