2011-12-14 4 views
0

Voici comment mon graphique est défini.Trouver tous les chemins entre deux nœuds dans un graphique

std::map< std::string, std::set<std::string> > g_db;

et après comment je l'ai fonction écrite pour calculer tous les chemins entre deux nœuds, basé sur une partie de la question précédente sur ce site.

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)); 
    } 
} 

Mon graphique est très grande, cette fonction se bloque avec une énorme liste des appels à recursive fonction avec le message suivant:

exception non gérée à 0x7c812afb dans Railways.exe: Microsoft C++ exception: std :: bad_alloc à l'emplacement de mémoire 0x00033748

pour petit graphique cela fonctionne très bien, mais pas pour le graphique énorme.

Quelqu'un peut-il m'aider à trouver le problème?

+0

Qu'essayez-vous d'accomplir? Essayez-vous de trouver un chemin optimal? –

+1

Comment votre programme plante-t-il? –

+0

@Andrew Shepherd: Je veux trouver tous les chemins possibles entre les deux nœuds. – Avinash

Répondre

4

Un trop grand nombre de niveaux de récursivité peut provoquer un blocage de débordement de pile. C'est pourquoi la récursivité n'est pas bien adaptée aux grands ensembles de données.

Mais tous les appels récursifs peuvent être réduits en boucles. Vous devriez essayer d'enlever les appels récursifs et les remplacer par des boucles.

+0

Y at-il un moyen itératif de trouver tous les chemins possibles dans un graphique. – Avinash

+1

Oui - http://stackoverflow.com/questions/159590/way-to-go-from-recursion-to-iteration –

+1

@Avinash: Vous obtenez un 'bad_alloc' plutôt qu'un débordement de pile. Je ne pense pas que la récursivité soit le problème - vous n'avez tout simplement pas assez de mémoire. –

Questions connexes