【问题标题】:Detecting cyclic pairs检测循环对
【发布时间】:2013-11-18 18:05:26
【问题描述】:

假设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&lt; std::pair&lt;char, char&gt; &gt;&amp; set); 只会被使用一次,而且对于 #include 一个像 boost 这样的大库来说,它应该是矫枉过正的...

任何想法如何解决这个问题?

【问题讨论】:

  • 你拥有的是一个邻接列表。使用它使用 DFS 构建树,并寻找后边缘。 en.wikipedia.org/wiki/Depth-first_search
  • {{A,B},{B,A}} 怎么样?还是{{A,B},{B,C},{A,C}}
  • @Beta 第一个仍然是我正在寻找的循环,第二个不是。

标签: c++ detection std-pair cyclic stdset


【解决方案1】:

这里有一个图,字符是它的顶点和集合中的对 - 边。您可以使用任何搜索轻松检测是否存在循环,例如 BFSDFS。 也看看this question。不要介意它处理无向案例,因为算法是相同的。

【讨论】:

    猜你喜欢
    • 2017-06-15
    • 2015-03-13
    • 2011-09-17
    • 2011-01-25
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多