2013-11-18 7 views
0

Предположим, что std::set< std::pair<char, char> >, может кто-нибудь предложить алгоритм или подход, чтобы проверить, существуют ли циклические пары?Обнаружение циклических пар

например.

std::set< std::pair<char, char> > cyclic = { {'A', 'B'}, {'B', 'C'}, {'C', 'A'} }; 
std::set< std::pair<char, char> > not_cyclic = { {'A', 'B'}, {'B', 'C'}, {'C', 'C'} }; 

isCyclic(cyclic);  // true 
isCyclic(not_cyclic); // false 

Я не хочу использовать любую Экстерну библиотеку (C++ библиотеки разрешена), так как функция bool isCyclic(const std::set< std::pair<char, char> >& set); будет использоваться только один раз, и она должна быть избыточна для #include большой библиотекой, как импульс только для этой одной функции ...

Любые идеи, как решить эту проблему?

+0

У вас есть список смежности. Используйте его, чтобы построить дерево, используя DFS, и найдите задний край. http://en.wikipedia.org/wiki/Depth-first_search – IdeaHat

+0

Как насчет '{{A, B}, {B, A}}'? Или '{{A, B}, {B, C}, {A, C}}'? – Beta

+0

@Beta Первый по-прежнему является циклическим, который я ищу, а второй - нет. – user2804578

ответ

0

У вас есть график, символы которого являются его вершинами и парами в наборе - ребрами. Вы можете легко определить, существует ли цикл, используя любой поиск, например, BFS или DFS. Также посмотрите на this question. Не против, что он имеет дело с неориентированным случаем, поскольку алгоритм один и тот же.