网格连接查询

时间:2015-03-09 18:56:45

标签: algorithm data-structures

给定一个大小为N×M的矩形网格,即1≤x≤N的单元格(x,y),1≤y≤M。

如果两个单元共用一侧,则它们相邻。更正式地说,如果| x1 - x2 |,则两个单元格(x1,y1),(x2,y2)相邻。 + | y1 - y2 |在两个相邻的单元之间可以有一个墙。如果它们之间有一条路,则连接两个单元a和b(换句话说,存在一系列单元c [1],c [2],...,c [k],使得c [1] = a ,c [k] = b,并且对于每个1≤i

现在我们获得Q查询,每个查询都有以下四种类型。

  1. 1 x y - 在单元格(x,y)和(x,y + 1)之间构建墙。如果它们之间已存在墙,则忽略此查询。
  2. 2 x y - 在单元格(x,y)和(x + 1,y)之间构建墙。如果它们之间已存在墙,则忽略此查询。
  3. 3 x1 y1 x2 y2 - 检查是否连接了单元格(x1,y1)和(x2,y2)。对此查询的回答是“是”或“否”
  4. 4 - 我们需要告诉最大连接组件的大小。连接组件是一组销售,其中每两个单元连接。连接组件的大小是其中的一些单元格。
  5. 注意:我们可以假设在查询之前网格上没有墙。

    现在给出N,M和Q查询,我们需要为类型3和4的查询说明答案。

    我的方法:我目前正在考虑通过创建一个图表,然后为每个查询执行dfs排序。这种方法可以提高效率还是有其他更好的方法来解决这个问题?

    网格的大小最大为1000 X 1000。查询最多可达10 ^ 6

    示例:设N = 3且M = 4,并且在开始时我们被询问类型3的查询是(1,1)连接到(3,4)然后答案为是,如前所述网格是这样的:

    http://postimg.org/image/5qoug2dov/

    现在假设我们有类型1和2的查询,网格变成这样:

    http://postimg.org/image/tm14jtg9h/

    现在,同一查询3的答案为否

1 个答案:

答案 0 :(得分:0)

假设您可以离线回答查询,然后以相反的顺序处理它们会将其转换为增量连接问题,这对于不相交的数据结构非常合适,其根节点会使用集合中的节点总数进行扩充。