当前位置: 首页 > news >正文

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

相关文章:

  • 【鸿蒙5.0】鸿蒙登录界面 web嵌入(隐私页面加载)
  • HTTP缓存
  • 【STL】deque(了解)
  • Linux | I.MX6ULL 终结者底板原理图讲解(4)
  • beikeshop多商户跨境电商独立站最新版v1.6.0版本源码
  • ACM模式常用方法总结(Java篇)
  • StarVector:开启多模态SVG生成的新纪元——开源AI模型的革新之作
  • 豪越科技消防一体化平台:打通消防管理“任督二脉”
  • 深度学习处理文本(2)
  • C语言快速入门-C语言基础知识
  • 2025年03月28日Github流行趋势
  • 10分钟看明白爆火的本地知识库! 掌握本地知识库基本概念与RAG的完整架构
  • 一文速通Python并行计算:04 Python多线程编程-多线程同步(下)—基于条件变量、事件和屏障
  • 【云原生】在Kubernetes上搭建Keycloak26.1.4
  • 【Rust基础】使用LanceDB构建高性能以图搜图服务
  • 代码随想录|回溯算法|09分割回文串
  • 排序--归并排序
  • Kubernetes service 基于工作原理的实验
  • IDEA 接入 Skywalking Agent ClassNotFoundException
  • 基于多二阶广义积分器的正负序谐波提取方法
  • 手表网站欧米茄官方/怎么样把自己的产品网上推广
  • 建网站商城平台/哪些网站可以免费发广告
  • 宝鸡做网站哪家公司好/汕头seo外包机构
  • 深圳在哪些网站上面做推广/太原seo优化公司
  • 东莞朝阳网站建设/百度推广营销方案
  • 微信域名防封跳转系统/保定网站建设方案优化