我在图表中有代表城镇的顶点。我试图找到从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
我如何以我想要的路径存储和打印路径?
答案 0 :(得分:0)
如果没有给出明确的信息细节,可以按照以下方式完成。
您可以使用用户定义的堆栈显式存储当前访问过的城市。到达目标城市时,堆栈包含城市的路径。
您的实现不使用单独的类型来表示节点。没有什么不妥。但是,如果它使用单独的类型,则可以为该类型赋予对另一个节点的父引用。如果边缘后跟算法,则访问节点的父引用将被设置为发起访问的节点。这样,在到达目标节点时,可以通过遵循这些引用来生成所需的路径。
由于实现缺少节点的单独类型,因此辅助字典(使用城市名称作为键和值,其中值是父城市)。在到达目的地节点时,可以通过迭代地跟随字典中的父节点来生成期望的路径。这种方法将使用与第2点相同的思想,而不为节点引入新类型。