zoukankan      html  css  js  c++  java
  • BFS 广度优先搜索

    #include <queue>
    #include <list>
    #include "BFS.h"
    using namespace std;
    
        BFS::BFS(int vertexCount){
            this->v = vertexCount;
            this->adj = new list<int>[v];
        }
    
    
        list<int> BFS::search(int s, int t){
            //最短路径结果集
            list<int> resultList;
            //需要遍历的邻接表index
            queue<int> startVertexQueue;
            //顶点访问标识,为true说明已经找到最短路径了,对应prev有值
            bool visited[v];
            //每个顶点到起点最近连线,的前一个顶点
            int prev[v];
    
            //-------------------初始化-------------------------------------------
            for (int i = 0; i < v; ++i) {
                visited[i] = false;
                prev[i] = -1;
            }
            //-------------------初始化起点----------------------------------------
            visited[s] = true;
            startVertexQueue.push(s);
    
            //-------------------开始循环所有邻接表---------------------------------
            while (startVertexQueue.size() != 0){
                //从待访问点队列里pop出一个点
                int thisRountStart = startVertexQueue.front();
                startVertexQueue.pop();
    
    
                list<int> adjThisR = adj[thisRountStart];
                list<int>::iterator it;
                for (it = adjThisR.begin(); it != adjThisR.end(); ++it) {
                    int edgeVertex = *it;
                    //如果之前没有访问过这个点,那么执行一些列操作
                    if (!visited[edgeVertex]){
                        //标记访问标识为已访问,因为这是第一次访问,即当前路径是最短的,以后再次访问的时候,可以直接跳过
                        visited[edgeVertex] = true;
                        //
                        startVertexQueue.push(edgeVertex);
                        prev[edgeVertex] = thisRountStart;
                        //如果这个点是我们的目的地,那么返回路径
                        if (edgeVertex == t){
                            int index = t;
                            resultList.push_front(t);
                            while (prev[index] != -1){
                                resultList.push_front(prev[index]);
                                index = prev[index];
                            }
                            return resultList;
                        }
                        startVertexQueue.push(edgeVertex);
                    }
                }
            }
            return resultList;
        }
    
  • 相关阅读:
    jquery 兼容的滚轮事件
    HTML5的manifest 本地离线缓存
    jquery.qrcode.js 生成二维码
    bootstrap modal垂直居中 (转)
    require.js Javascript模块化
    基于特征检测(SURF,SIFT方法)与特征匹配(Feature Matching)(FLANN方法)来寻找目标
    自动跟踪足球场上所有的选手
    python3.7+opencv3.4.1
    神经网络
    使用Python+OpenCV进行图像模板匹配(Match Template)
  • 原文地址:https://www.cnblogs.com/IC1101/p/13609460.html
Copyright © 2011-2022 走看看