连接图的C ++递归

时间:2013-10-08 14:07:51

标签: c++ recursion graph connectivity

我还没有实现任何东西,但是我正在考虑使用递归来识别网格中与给定单元“主动连接”的所有单元格,即“活动”且直接连接的单元格通过与其(活动)邻居之一共享面部,与所讨论的(活动)小区共享一个面部或更远距离/间接地连接。断开是因为网格中的一些单元可能被认为是“不活动的”(无论定义如何)。我的想法/伪代码如下:

//Call function to traverse connections
traverse_connections(cell);

//Traverse function definition
bool traverse_connections(cell) {
  //Check if cell is inactive or traversed - base case
  if (current cell is inactive or traversed) {
     return true;
  }
  //-Mark cell then move on to its neighbors
  Mark cell as traversed and add it to the list of 'actively connected' cells;
  bool ok = true;
  for(neighbor_cell in neighbors of cell) {
     ok &= traverse_connections(neighbor_cell);
  }
  return ok;
}

我认为这涵盖了基本情况,标记了单元格,然后继续为其邻居,邻居的邻居做同样的事情,等等。这看起来不错吗?我缺少哪些明显的差距?如果任何具有图形连接和递归专业知识的人都可以权衡,我将不胜感激。我也很难找到迭代的等价物。任何有关这方面的想法都会受到高度赞赏。

提前致谢!

2 个答案:

答案 0 :(得分:2)

此解决方案不起作用,因为它混合了“遍历”和“活动/连接”的概念。这两者是正交的:例如,一个单元可以是非活动的并且遍历,或者是活动的而不是遍历的。您的伪代码顶部的if语句会返回true,这是不正确的。

您应该保留一个表,该表将单独遍历的单元格标记为标记单元格活动的表格。您需要确保在进入递归调用之前标记遍历的单元格,否则解决方案可能太慢,甚至用完堆栈。

最后,解决方案不需要递归:您可以通过简单的Breadth-first search来完成所需的操作,这可以通过队列而不是递归来完成。

答案 1 :(得分:1)

此刻标记细胞的方式很可能会导致您出现问题。例如,如果您正在标记的这些单元格中的一个具有需要稍后遍历的相邻单元格,则它们可以是未遍历的。

如果您查看A*(A-Star)算法,它应该让您对图遍历有所了解。 UCS(统一成本搜索)也是使用图遍历的另一种算法。