在图上实现BFS

Implementing BFS on a graph

本文关键字:BFS 实现      更新时间:2023-10-16

我在图中有代表城镇的顶点。我正在尝试找到从a点到b点的最短路径。

我已经创建了一个图形类。

struct Edge{
    string name;
    vector< Edge *> v;
    Edge( string n ){
        name = n;
    }
};
class Graph{
public:
        Graph(){};
        void addEdge( string start_point , string end_point){
            graph[ start_point ] -> v.push_back( graph[ end_point ]);
        }
        void addPeak( string name ){
            graph[name] = new Edge(name);
            size++;
        }
        void printPeaks(){
            for( auto &a : graph){
                cout << a . first << endl;
            }
        }
    void getRoad( string starting , string ending ){
        map< string , bool > visited;
        queue< Edge * > q;
        for( auto &a : graph ){
            visited[ a.first ] = false;
        }
        q.push( graph[starting] );
        while( ! q.empty( )){
                Edge *tmp = q.front();
                q.pop();
                cout << tmp -> name << endl;
                if( tmp -> name  == ending ){
                        cout << "found " << endl;
                        break;
                }
                for( unsigned int i = 0; i < tmp -> v.size() ; i++){
                    q.push( tmp -> v [i]);
                }
        }
    }
private:
    map< string , Edge *> graph;
    int size = 0;
};

我将按如下方式添加顶点和边。

Graph g;
    g.addPeak("Prague");
    g.addPeak("Bratislava");
    g.addPeak("Budapest");
    g.addPeak("Berlin");
    g.addPeak("Moscow");
    g.addPeak("London");
    g.addEdge("Bratislava", "Berlin");
    g.addEdge("Bratislava" , "Budapest");
    g.addEdge("Bratislava" , "London");
    g.addEdge("Berlin" , "Moscow");
    g.addEdge("Budapest" , "Berlin");
    g.getRoad("Bratislava", "Moscow");

在最后一行我想找到从布拉迪斯拉发到莫斯科的最短路径。正如我在代码中演示的那样,我可以找到路径,但同时所有与布拉迪斯拉发有边界的其他城镇也被打印出来。而不是期望的输出

Bratislava 
Berlin
Moscow

打印如下列表

Bratislava
Berlin
Budapest
London
Moscow

我如何存储和打印路径只是我想要的路径?

在不给出显式实现细节的情况下,可以这样做。

  1. 您可以使用用户定义的堆栈来显式存储当前访问的城市。当到达目标城市时,堆栈包含到该城市的路径。

  2. 您的实现没有使用单独的类型来表示节点。这并没有错。但是,如果它将使用单独的类型,则可以为该类型赋予对另一个节点的父引用。如果该算法遵循一条边,被访问节点的父引用将被设置为开始访问的节点。这样,在到达目标节点时,可以通过遵循这些引用来生成所需的路径。

  3. 由于实现缺乏节点的单独类型,所以需要一个辅助字典(它使用城市名称作为键和值,其中值是父城市)。在到达目标节点时,可以通过迭代地跟踪字典中的父节点来生成所需的路径。此方法将使用与第2点相同的思想,而无需为节点引入新类型。