在图上实现BFS
Implementing BFS on a graph
我在图中有代表城镇的顶点。我正在尝试找到从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
我如何存储和打印路径只是我想要的路径?
在不给出显式实现细节的情况下,可以这样做。
-
您可以使用用户定义的堆栈来显式存储当前访问的城市。当到达目标城市时,堆栈包含到该城市的路径。
-
您的实现没有使用单独的类型来表示节点。这并没有错。但是,如果它将使用单独的类型,则可以为该类型赋予对另一个节点的父引用。如果该算法遵循一条边,被访问节点的父引用将被设置为开始访问的节点。这样,在到达目标节点时,可以通过遵循这些引用来生成所需的路径。
-
由于实现缺乏节点的单独类型,所以需要一个辅助字典(它使用城市名称作为键和值,其中值是父城市)。在到达目标节点时,可以通过迭代地跟踪字典中的父节点来生成所需的路径。此方法将使用与第2点相同的思想,而无需为节点引入新类型。
相关文章:
- 如果没有malloc,链表实现将失败
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- pacman 实现 BFS 来查找 pacman 路径
- 我正在尝试实现 BFS 并通过边缘计算所有访问的节点。但是我的代码给了我 0 计数,除了第一个
- 用STL在C++中实现图和BFS
- 实现迷宫树以在DFS,BFS中使用
- 如何在实现BFS的同时打印节点的前身
- BFS的STL实现:访问邻接列表时出现问题
- 在图上实现BFS
- 在c++中使用STL实现BFS
- 使用c++实现BFS