在图表上实现BFS

时间:2016-10-10 17:14:41

标签: c++ graph-algorithm breadth-first-search

我在图表中有代表城镇的顶点。我试图找到从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 个答案:

答案 0 :(得分:0)

如果没有给出明确的信息细节,可以按照以下方式完成。

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

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

  3. 由于实现缺少节点的单独类型,因此辅助字典(使用城市名称作为键和值,其中值是父城市)。在到达目的地节点时,可以通过迭代地跟随字典中的父节点来生成期望的路径。这种方法将使用与第2点相同的思想,而不为节点引入新类型。