c++ - 查找图中两个节点之间的所有路径

标签 c++ algorithm data-structures stl

以下是我的图表的定义方式。

std::map< std::string, std::set<std::string> > g_db;

以下是我如何编写函数来计算两个节点之间的所有路径,基于本网站上的一些先前问题。

void compute_all_paths(std::vector<std::string>& visited,  std::string& dest ) {  
    std::string back           = visited.back();    
    std::set<std::string> adj_stations = g_db.find(back)->second;

    for ( std::set<std::string>::iterator itr = adj_stations.begin();  itr != adj_stations.end(); ++itr )  {  
        if ( std::find(visited.begin(), visited.end(), *itr) != visited.end())
            continue;
        if (*itr == dest) {
            visited.push_back( *itr );    
            for ( std::vector<std::string>::size_type idx = 0; idx < visited.size(); idx++ ){  
                std::cout << visited[idx] << " ";  
            }
            std::cout << std::endl;  
            visited.erase( visited.begin() + (visited.size() - 1));    
            break;
        }
    }  
    for ( std::set<std::string>::iterator itr = adj_stations.begin();  itr != adj_stations.end();  itr++ )  {  
        if ( std::find(visited.begin(), visited.end(), *itr) != visited.end() || *itr == dest ) 
            continue;
        visited.push_back( *itr );    
        compute_all_paths(visited, dest );            
        visited.erase( visited.begin() + (visited.size() - 1));  
    }  
} 

我的图非常大,这个函数因大量调用 recursive 而崩溃具有以下消息的函数:

Unhandled exception at 0x7c812afb in Railways.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x00033748

对于小图,这非常有效,但不适用于大图。

任何人都可以帮我找到问题。

最佳答案

过多的递归级别会导致堆栈溢出崩溃。这就是递归不太适合大型数据集的原因。

但是所有的递归调用都可以简化为循环。您应该尝试删除递归调用并用循环替换它们。

关于c++ - 查找图中两个节点之间的所有路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8502851/

相关文章:

java - 将数据存储在有效的数据结构中,以便快速搜索

c++ - 使用 std::map 从数组中删除重复项

java - 如何从java中的链接列表中的节点检索对象的内容

c# - 如何将结构指针从 c# 传递到 win32 DLL

c++ - 使用现有的 Q_PROPERTY 为继承 QObject 的 QGraphicsItem 制作动画

c++ - 在一个程序中处理多个 QT Designer UI 文件的最佳方法是什么?

c++ - Qwt替代方案

java - Java 8 Stream.sum() 的错误行为

algorithm - coursera公开课中关于heap的问题

c++ - 打印链接列表的元素,但是打印相反的C++