Найти все пути между двумя узлами в графе - PullRequest
0 голосов
/ 14 декабря 2011

Ниже описывается, как определяется мой график.

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 со следующим сообщением:

Необработанное исключение при0x7c812afb в Railways.exe: исключение Microsoft C ++: std :: bad_alloc в ячейке памяти 0x00033748

Для маленьких графиков это работает очень хорошо, но не для огромных.

Может кто-нибудь помочь мнечтобы найти проблему.

1 Ответ

4 голосов
/ 14 декабря 2011

Слишком много уровней рекурсивности может вызвать сбой переполнения стека.Вот почему рекурсивность не подходит для больших наборов данных.

Но все рекурсивные вызовы могут быть сведены к циклам.Вы должны попытаться удалить рекурсивные вызовы и заменить их циклами.

...