假设有n
个不同点P1, P2,...,Pn
。
将连通性矩阵M=(c_ij)
定义为大小为n
的方形矩阵。c_ij
如果true
或者有一个线段,则会i=j
点Pi
和Pj
之间。
如果在任意两点之间存在至少一条路径(一组线段),则连接一组点。我们将连接的点集称为正确的图形。一个点本身可以是一个合适的图形。
当第一个图形中的任何点与第二个图形中的任何点都没有连接时,会断开两个正确的图形。
连接性定义为断开连接的正确图形的数量。
例如,
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))
。
答案 0 :(得分:0)
您正在寻找图表的连接组件。
不幸的是,像这样的邻接矩阵非常不理想,因为你不能比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
地图中的列表是连接的组件。