找出图中两个节点之间的所有路径

Find all the paths between two nodes in a graph

本文关键字:之间 节点 路径 两个      更新时间:2023-10-16

我的图是这样定义的

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函数的调用有以下消息:

在Railways.exe: microsoftc++中0x7c812afb的未处理异常异常:std::bad_alloc在内存位置0x00033748

对于小图形,这个方法非常有效,但是对于大图形,这个方法就不适用了。

谁能帮我找出这个问题

太多层次的递归会导致堆栈溢出崩溃。这就是为什么递归不太适合大型数据集。

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