【问题标题】:Contiguous (USA) State Check连续(美国)州检查
【发布时间】:2012-07-27 14:55:46
【问题描述】:

给定一个州列表,就像美国的州一样,我正在尝试编写一个算法来判断这些州是否是连续的。顺序无关紧要,可以重新访问状态。

例子:

  • AZ, CA, OR, WA 是连续的
  • AZ, CA, NM, UT 是连续的
  • AZ, NM, OR, WA 不连续

假设:

  1. 我有一组代表状态的字符串。
  2. 我有一组状态连接。

    class StateConnection
    {
        public string OriginState { get; set; }
        public string ConnectingState { get; set; }
    }
    

这个集合有两个方向的记录:

  • OriginState = AZ, ConnectingState = CA
  • OriginState = CA, ConnectingState = AZ

我尝试了什么?

尝试 1: 对于集合中的每个状态,检查列表中是否至少存在一个与另一个状态的 StateConnection。

为什么它不起作用? 这允许第三个示例,其中有两个单独的连续范围要通过。

尝试 2: 检查后从候选连接状态列表中删除状态。这将需要一个完整的路径,该路径触及每个状态一次。

为什么它不起作用? 这不允许第二个示例,其中一个状态充当多个状态的中心。

好久没解决图论问题了,有点生疏了。

我不寻求最短路径或旅行推销员之类的东西。我不在乎走哪条路或使用了多少步。我只关心有没有差距。

我写的是 C#,但请随时用其他语言给出答案。

【问题讨论】:

    标签: c# .net graph-theory


    【解决方案1】:

    看看图论中的Flood Filling。您可能希望“绘制”树中的每个连接节点,然后在最后检查您的任何状态是否保持未连接。无论您如何遍历图形来进行绘画(BFS 或 DFS),但这会突出显示间隙(或未连接的节点)。

    【讨论】:

      【解决方案2】:

      听起来最好的解决方案只是通过状态图进行广度优先搜索。类似于(以第一个列表为例):

      • 创建要检查的状态队列。首先,它是空的。
      • 在列表中选择一个状态,例如CA,加入队列。

      然后循环如下:

      • 从队列中取出一个状态。将其标记为已访问。
      • 检查它的任何直接邻居(尚未访问过的)是否在列表中。如果是,请将它们添加到队列中。
      • 例如对于CA,我们在列表中找到了两个邻居:ORAZ;将它们添加到要检查的下一个状态队列中。稍后,在检查OR 时,我们会看到WACA 是它的邻居并且在列表中;但是CA 已经被访问过,所以我们只会将WA 添加到要访问的状态列表中。

      继续直到没有更多的状态可以出队。如果到那时我们已经访问了初始列表中的所有状态,那么该列表是连续的。否则不是。

      【讨论】:

        【解决方案3】:

        创建相关状态子集的连接矩阵(N*N 布尔矩阵,其中包含子集中每个状态的行和列,m[i,j]==true 当且仅当状态 i 和 @987654325 @ 彼此相邻)。

        运行以下算法:

        for (int k=0 ; k != N ; k++)
            for (int i=0 ; i != N ; i++)
                for (int j=0 ; j != N ; j++)
                    m[i,j] |= (m[i,k] && m[k,j]);
        

        验证三个循环结束后m[i,j] 的所有元素都设置为true。如果任何元素是false,则状态不连续。

        如果你忘记了什么是“那个三循环的东西”,那就是著名的Floyd-Warshall algorithm,用于寻找图的传递闭包。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-09
          相关资源
          最近更新 更多