【发布时间】:2011-12-14 10:22:28
【问题描述】:
以下是我的图表的定义方式。
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
对于小图,这很有效,但对于大图则不行。
谁能帮我找到问题。
【问题讨论】:
-
你想达到什么目的?您是否正在寻找最佳路径?
-
@Andrew Shepherd :我想找到两个节点之间所有可能的路径。
-
考虑
using namespace std;(或至少像using std::set;、using std::string;这样的单个类)。尝试吸收这样的代码示例时,它可以减少混乱。 -
@Björn Pollex 我没有得到你的问题。
-
@Avinash:你有没有收到任何消息,或者它只是停止了?当它崩溃时究竟会发生什么?
标签: c++ algorithm data-structures stl