2016-03-25 15 views
1

Ich schreibe eine Funktion, die einige Berechnungen auf Graphen mit dem BGL durchführt. Die Art der Berechnung hängt davon ab, ob der Graph ausgerichtet ist oder nicht, aber ich möchte vermeiden, zwei verschiedene Funktionen zu schreiben, eine für ungerichtete Graphen und eine für gerichtete Graphen. Beiden Arten von Graphen definiert werden alsBoost Graph Library: Überprüfen, ob ein Diagramm gerichtet ist oder nicht

using namespace boost; 
// Undirected 
typedef adjacency_list<listS, vecS, undirectedS> UGraph; 
// Directed 
typedef adjacency_list<listS, vecS, bidirectionalS> DGraph; 

folgt Gibt es eine Möglichkeit zu überprüfen, ob ein Graph gerichtet ist oder nicht aus dem Diagrammobjekt selbst? Mit anderen Worten, gibt es eine Möglichkeit, aus dem Graphenobjekt die verwendete "directedness" -Eigenschaft zu kennen (d. H. Ungerichtet S, Bidirektional oder gerichtet S)?

Antwort

0

fand ich die Antwort, während bei der Definition der Funktion print_graph() in graph_utility.hpp suchen, die mich is_directed() in graph_traits.hpp definiert die Funktion geführt.

ich es nehme an, ein eleganter Weg sein kann, dies zu tun, aber hier ist ein minimales Arbeitsbeispiel:

#include <iostream> 
#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/graph_traits.hpp> 


template <typename graph_t> 
void print_directedness(graph_t &g) 
{ 
    // Typedef of an object whose constructor returns "directedness" of the graph object. 
    typedef typename boost::graph_traits<graph_t>::directed_category Cat; 
    // The function boost::detail::is_directed() returns "true" if the graph object is directed. 
    if(boost::detail::is_directed(Cat())) 
    std::cout << "The graph is directed." << std::endl; 
    else 
    std::cout << "The graph is undirected." << std::endl; 
} 


int main() 
{ 

    // Creates an undirected graph and tests whether it is directed of not. 
    boost::adjacency_list< boost::setS, boost::vecS, boost::undirectedS > UnGraph; 
    print_directedness(UnGraph); 

    // Creates a directed graph and tests whether it is directed of not. 
    boost::adjacency_list< boost::setS, boost::vecS, boost::directedS > DiGraph; 
    print_directedness(DiGraph); 

    // Creates a bidirectional graph and tests whether it is directed of not. 
    boost::adjacency_list< boost::setS, boost::vecS, boost::bidirectionalS > BidiGraph; 
    print_directedness(BidiGraph); 

    return 0; 
} 

die korrekt

>> g++ minimal_working_example.cpp -o minimal_working_example 
>> ./minimal_working_example 
The graph is undirected. 
The graph is directed. 
The graph is directed. 
zurück