【问题标题】:Function to determine connectedness确定连通性的函数
【发布时间】:2016-09-24 23:35:38
【问题描述】:

假设有n 不同的点P1, P2,...,Pn

将连通性矩阵M=(c_ij) 定义为大小为n.c_ij 的方阵,如果i=j 或在点PiPj 之间存在线段,则将给出true

如果任意两点之间至少有一条路径(一组线段),则连接一组点。我们称连接的点集为真图。一个点本身可以​​是一个适当的图形。

当第一个图中的任何点与第二个图中的任何点都没有连接时,两个正确的图就会断开连接。

连通性定义为断开的正确图的数量。

例如,

       P1    P2    P3    P4    P5
 P1   true  false true  false false
 P2   false true  false false false
 P3   true  false true  false true
 P4   false false false true  true
 P5   false false true  true  true

有两个不连贯的真图,即P2{P1,P3,P4,P5}

我的问题是如何编写一个函数来接收连通性矩阵并返回一个断开连接的正确图列表。例如,上面的例子应该返回list(list(1,3,4,5),list(2))

【问题讨论】:

    标签: algorithm graph


    【解决方案1】:

    您正在寻找图形的连通分量。

    不幸的是,像这样的邻接矩阵不是最理想的,因为你不能比 O(n^2) 更快。在下文中,我将描述您可以使用的两种解决方案。当您可以直接访问邻居时,第一个更好,如果您可以直接访问边缘,则第二个更好。这些都不适用于您的场景。对于邻接矩阵,两种解决方案的时间复杂度相等。所以你必须测量,哪个实际上更快。

    如果你有一个可以让你直接访问邻居的数据结构,你可以使用 BFS 或 DFS 来获取连接的组件。该方法在this answer 中有描述。请注意,此答案中所述的时间复杂度不适用于您的场景。

    对于可以访问边缘的情况,您可以使用union-find data structure。然后您可以执行以下操作:

    Initialize union-find uf with n entries
    for every edge (i, j)
        uf.union(i, j)
    next
    initialize map int -> list of vertices
    for every vertex v
        p <- uf.representative(v)
        map[p].insert(v)
    next
    

    地图中的列表就是连接的组件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-13
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多