2016-12-07 10 views
1

Использование наддува библиотеки графа, у меня есть этот тип графа:Как найти равенство двух ребер в неориентированном графе?

typedef boost::adjacency_list< 
    boost::vecS,        //OutEdgeList 
    boost::vecS,        //VertexList 
    boost::undirectedS     //Directed 
> Graph; 

и добавить несколько 2-х ребер:

boost::add_edge(0, 1, g); 
boost::add_edge(0, 2, g); 
boost::add_edge(1, 0, g); 
boost::add_edge(2, 4, g); 
boost::add_edge(4, 3, g); 
boost::add_edge(3, 1, g); 

Я хочу, чтобы проверить "равенство" из 2 egdes: 0-1 и 1-0.

Мне нужна начальная точка для реализации.

Спасибо

+0

почему вы думаете Вы нуждаетесь в этом? Вы можете просто использовать 'boost :: setS' для OutEdgeList, и никакие дубликаты не могут возникнуть. – sehe

ответ

0

Мое решение, конечно, не самый элегантный. Вот что я сделал: Я помещаю вершины в пары, завершаю функцию равенства, а затем проверяю равенство пары.

1) поместить вершины в паре с:

std::pair<unsigned int, unsigned int> pairEdge(boost::numeric_cast<unsigned int>(boost::source(e, g)), boost::numeric_cast<unsigned int>(boost::target(e, g))); 

2) выполнить функцию равенства

template <typename T1, typename T2> 
    bool pairEquality(std::pair<T1, T2> &lhs, std::pair<T1, T2> &rhs) { 
     //standard way 
     if (lhs == rhs) { 
      return true; 
     }; 

     //permutation 
     std::pair<T1, T2> lhsSwap(lhs.second, lhs.first); 
     if (lhsSwap == rhs) { 
      return true; 
     } 
     return false; 
    } 

3) проверить равенство через цикл стека