[英]Find all the paths between two nodes in a graph
以下是我的图形的定义方式。
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中0x7c812afb的未处理异常:Microsoft C ++异常:内存位置0x00033748的std :: bad_alloc
对于小图,这很好用,但对大图则不行。
谁能帮我找到问题。
太多级别的递归会导致堆栈溢出崩溃。 这就是为什么递归性不适用于大型数据集的原因。
但是所有递归调用都可以简化为循环。 您应该尝试删除递归调用并将其替换为循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.