如何在隐式图中找到许多连接的组件?

时间:2017-09-27 09:59:27

标签: algorithm graph depth-first-search implicit connected-components

我有一个CS问题,如下所述:

给出一张纸,其中有一些单元格被切掉,用字符表示('('(cut)或'#'(not cut)),我需要找到会形成多少件。

示例:

##..#####.
.#.#.#....
###..##.#.
..##.....#
.###.#####

以上示例的答案为 5

将形成一件作品:

....
.##.
....

将形成两件作品:

....
.#..
..#.

常识建议我找到一种用图表来表示工作表的方法(每个数字符号是一个顶点,如果它们共享一个边,则连接两个顶点)。但是,我不清楚如何做到这一点。我发现有隐式图形(由函数定义的图形返回给定顶点的所有邻居)。像这样的函数在这种情况下实现是微不足道的。

问题是:如何修改DFS算法以在此类图表中查找组件?

1 个答案:

答案 0 :(得分:1)

  1. 当我们从顶点循环边缘时,我们使用隐式边缘而不是存储边缘。

  2. 将顶点表示为二维坐标(row, col)非常有用。

  3. 伪码可以如下:

    dRow = [-1,  0, +1,  0]
    dCol = [ 0, -1,  0, +1]
    ...later, when we want to move from vertex (row, col)...
    for dir in [0..4):
        nRow = row + dRow[dir]
        nCol = col + dCol[dir]
        if vertex (nRow, nCol) is in rectangle bounds:
            try to move from vertex (row, col) to vertex (nRow, nCol)
    

    在经典DFS实现具有类似循环的地方:

    for each vertex u in {neighbors of vertex v}:
        try to move from vertex v to vertex u