【问题标题】:Grid connectivity queries网格连接查询
【发布时间】:2015-03-09 18:56:44
【问题描述】:

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

如果两个单元格共享一条边,则它们是相邻的。更正式地说,如果 |x1 − x2|,则两个单元 (x1, y1), (x2, y2) 是相邻的+ |y1 - y2| = 1. 在两个相邻的单元格之间可以有一堵墙。如果两个单元格 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 - 我们需要知道最大连接组件的大小。连接组件是一组销售,其中每两个单元都连接。连接组件的大小是其中的单元数。

注意:我们可以假设在查询之前网格上没有墙。

现在给定 N 、 M 和 Q 查询,我们需要告诉类型 3 和 4 查询的答案。

我的方法:我目前正在考虑通过制作一个图表然后为每个查询做 dfs 之类的事情来做到这一点。这种方法可以提高效率还是有其他更好的方法来解决这个问题?

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

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

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

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

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

现在同一个查询 3 的答案是否定的

【问题讨论】:

标签: algorithm data-structures


【解决方案1】:

假设您可以离线回答查询,然后以相反的顺序处理它们,这会变成一个增量连接问题,这对于根节点随集合中节点总数增加的不相交集数据结构来说是完美的。

【讨论】:

  • 请解释一下:“根节点增加了集合中的节点总数。”
猜你喜欢
  • 2012-05-10
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 2012-04-25
  • 2014-02-19
  • 2012-02-20
相关资源
最近更新 更多