2015-04-15 1 views
0

Je rencontre un graphique bi-directionnel (à savoir un graphe orienté dans lequel il est possible d'itérer à la fois l'en-bords et les bords sortants). Chaque vertex, entre autres propriétés internes, possède une propriété ID spéciale qui est un nombre entier d'un ensemble fini (quelques centaines) connu au démarrage du programme, c'est-à-dire qu'il ne changera pas pendant la durée de vie du programme, mais il est inconnu au moment de la compilation.Dans BGL, comment trouver efficacement un sommet adjacent à l'aide d'une propriété d'un sommet

Cette propriété n'est pas unique à la portée du graphique (c'est-à-dire qu'il peut y avoir deux sommets avec le même ID) et ne peut donc pas être utilisée avec named/label_graph. Il est cependant unique dans le cadre d'un Vertex, étant donné à la fois les voisins entrants et les sortants voisins d'un sommet doivent tous avoir des ID différents.

Ma question est de savoir s'il y a une accumulation dans le mécanisme de BGL pour trouver efficacement un sommet adjacent u, de v donné u descripteur de, le graphique et l'ID de u. Cela peut bien sûr être réalisé en utilisant un mappage externe, mais cela semble assez commun, et étant donné que le premier paramètre template de adjacentency_list peut être un conteneur associatif - il semble naturel d'avoir une sorte de find_adjacent (v , g, ID) fonctionne, hélas, je n'ai pas pu trouver quelque chose comme ça.

Un grand merci, Andrey

Répondre

0

Vous ne publiez pas un échantillon, mais à partir de la description donnée, vous pouvez sélectionner un ensemble ordonné pour le OutEdgeList et l'ordre par l'ID de sommet cible (ce qui est unique dans cette portée). Maintenant vous pouvez utiliser std::lower_bound/std::upper_bound/std::equal_range sur les out_edges d'un nœud donné.

Si vous préférez, vous pouvez facilement ajouter des fonctions libres comme find_adjacent pour cacher la mise en œuvre.