【问题标题】:Find all the paths between two nodes in a graph查找图中两个节点之间的所有路径
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 是否有一种迭代方式可以在图中找到所有可能的路径。
  • @Avinash:你得到的是bad_alloc,而不是堆栈溢出。我不认为递归是问题 - 你只是没有足够的内存。
  • @BjörnPollex 同意,但他只是在我回答问题后才编辑答案。
猜你喜欢
  • 2012-03-21
  • 2017-08-21
  • 1970-01-01
  • 2014-07-09
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多