问题:
形成一个网络,也就是说,所有基地都应该可以从每个基地到达。
如果有连接基地的隧道路径,则可以从其他基地到达一个基地。
基于具有整数坐标的2-D平面假设基础。
在两个基地之间建造隧道的成本是坐标(x1,y1)和(x2,y2)是min {| x1-x2 |,| y1-y2 | }。
网络形成的最低成本是多少。
1 ≤ N ≤ 100000 // Number of bases
-10^9 ≤ xi,yi ≤ 10^9
典型的 Kruskal的最小生成树实现。但是你不能存储(10 ^ 5)^ 2个边。 那么我应该如何制作成本矩阵,如何制作图表以便我可以应用Kruskal算法?
答案 0 :(得分:1)
您不应该存储整个图表,因为您实际上并不需要它。实际上在这种情况下,我认为Prim's算法在这种情况下更合适。您不会在任何时候都需要所有边,而是在每次迭代时,您将更新大小为N
的min dist数组。当然复杂性仍然是N**2
的顺序,但至少内存不会成为问题。您还可以进一步使用计算距离的特定方式来提高复杂性(使用一些有序的结构来存储点)。
答案 1 :(得分:1)
我相信唯一可以使用的边缘(由于你的成本函数)将从每个基地到最多4个邻居。使用的邻居是具有更大(或相等)x值的最近点,具有更小(或相等)x值的最近点,具有更大(或相等)y值的最近点,具有更小(或相等)的最近点y值。
您可以通过根据每个轴对点进行排序,然后按照排序顺序将每个点与前方和后方的点相关联来有效地计算这些邻域。
如果坐标的特定值有多个点,则无关紧要。
因此,Kruskal的算法只能考虑O(4n)个边缘。