python - 如何找到加权顶点的中心枢纽
问题描述
因此,我正在开发一个程序,该程序采用一组顶点并从中生成 Kruskal 生成树。我把它记下来了,但现在我需要获取顶点并找到一个中心集线器,通过它我需要找到所有其他顶点之间的总距离最短的顶点。我正在考虑制作一棵 BFS 树,但我不确定如何实现这些点以及实现它的距离。
from collections import defaultdict
# Class to represent a graph
class Graph:
def __init__(self, vertices):
self.V = vertices # No. of vertices
self.graph = [] # default dictionary
# to store graph
# function to add an edge to graph
def addEdge(self, u, v, w):
self.graph.append([u, v, w])
# A utility function to find set of an element i
# (uses path compression technique)
def find(self, parent, i):
if parent[i] == i:
return i
return self.find(parent, parent[i])
# A function that does union of two sets of x and y
# (uses union by rank)
def union(self, parent, rank, x, y):
xroot = self.find(parent, x)
yroot = self.find(parent, y)
# Attach smaller rank tree under root of
# high rank tree (Union by Rank)
if rank[xroot] < rank[yroot]:
parent[xroot] = yroot
elif rank[xroot] > rank[yroot]:
parent[yroot] = xroot
# If ranks are same, then make one as root
# and increment its rank by one
else:
parent[yroot] = xroot
rank[xroot] += 1
# The main function to construct MST using Kruskal's
# algorithm
def KruskalMST(self):
result = [] # This will store the resultant MST
# An index variable, used for sorted edges
i = 0
# An index variable, used for result[]
e = 0
# Step 1: Sort all the edges in
# non-decreasing order of their
# weight. If we are not allowed to change the
# given graph, we can create a copy of graph
self.graph = sorted(self.graph,
key=lambda item: item[2])
parent = []
rank = []
# Create V subsets with single elements
for node in range(self.V):
parent.append(node)
rank.append(0)
# Number of edges to be taken is equal to V-1
while e < self.V - 1:
# Step 2: Pick the smallest edge and increment
# the index for next iteration
u, v, w = self.graph[i]
i = i + 1
x = self.find(parent, u)
y = self.find(parent, v)
# If including this edge does't
# cause cycle, include it in result
# and increment the indexof result
# for next edge
if x != y:
e = e + 1
result.append([u, v, w])
self.union(parent, rank, x, y)
# Else discard the edge
minimumCost = 0
print ("Edges in the constructed MST")
for u, v, weight in result:
minimumCost += weight
print("%d -- %d == %d" % (u, v, weight))
print("Minimum Spanning Tree" , minimumCost)
# Driver code
g = Graph(4)
# so point 0 goes to 1 with a distance of 10
g.addEdge(0, 1, 10)
g.addEdge(0, 2, 6)
g.addEdge(0, 3, 5)
g.addEdge(1, 3, 15)
g.addEdge(2, 3, 4)
# Function call
g.KruskalMST()
解决方案
如果我理解正确,您有一棵树(从初始图派生的最小生成树),并且需要找到节点,以使其与任何其他节点的最大距离最小化。
这可以分两步完成,两个步骤都与 中的节点数量成线性关系:
确定 中的最长路径。这可以通过两次遍历(深度或广度优先)来完成:
选择一个节点并在 中找到离它最远的节点。然后从 in 开始执行第二次遍历,以在 中找到离它最远的节点。路径 (, ) 表示 中的最长路径。另请参见树中最长路径的线性算法
问题现在简化为在路径 (, ) 上找到“中间”节点。对从 和 开始的路径执行简化的广度优先搜索:因此您有沿 相互遍历的引用,始终将 dist(, ) 和 dist(, ) 保持在最小值。和将相遇的节点是中间节点。离节点 in 最远的节点是 或 。
推荐阅读
- python - 当我在 PowerBi 中编写这个 python 脚本时,我怎样才能只得到一个表?
- javascript - 如何使用带有事件参数和参数的函数添加和删除事件侦听器?
- azure - 如果发生故障,如何在 Azure 管道中执行任务分支?
- dataset - 在 covid-19 期间在哪里可以下载印度人的流动性数据
- loops - 如何在 presto SQL 或 spark SQL 中使用循环
- ios - 如何取消与外围设备的挂起本地连接
- python - 张量流没有属性'no_automatic_dependency_tracking'
- algorithm - 如何对树数据结构进行分片
- python - 一旦发电机列表中的发电机用尽,是否继续使用其他发电机?
- eclipse - 在插件开发期间,在运行时 Eclipse 中未解析 Maven 依赖类