我正在尝试实现prims算法来查找图的MST。我在图中给出了节点的邻接列表。 EX:[[10001,5,8,4],[5,10001,6,9],[8,6,10001,10],[4,9,10,10001]]其中数字是两者之间的长度节点i和j。
我实现了以下代码来检查创建边缘并返回mst中的列表边缘。但是,似乎无法得到正确的答案。
这是我的代码。
def find_MST(n, length):
print(length) #this is only for debugging purposes
n = len(length)
dist = [float('inf') for i in range(n)]
prev = [None for i in range(n)]
done = [False for i in range(n)]
dist[0] = 0
q = [i for i in range(len(length))]
while len(q) > 0:
smaller = MAX_LENGTH
for i in q:
if dist[i] < smaller:
smaller = dist[i]
pos = i
u = q[q.index(pos)]
q.pop(q.index(pos))
if dist[u] == float('inf'):
break
for v in range(len(length[u])):
alt = length[u][v]
if dist[v] > alt:
dist[v] = alt
prev[v] = u
l = []
for i in range(len(prev)):
if prev[i] != None:
edge = (min(prev[i],i), max(prev[i], i))
l.append(edge)
return l
anybode可以让我知道我应该改变什么来让它给出正确的输出吗?
这是一个例子: 其中每一行都是不同的测试用例 我的输出:
(0, 1)
(0, 2) (1, 2)
(0, 1) (2, 3) (2, 3)
(0, 1) (0, 2) (0, 3)
(0, 1) (0, 3) (1, 2)
正确输出:
(0, 1)
(0, 2) (1, 2)
(0, 1) (0, 3) (2, 3)
(0, 1) (0, 2) (0, 3)
(0, 1) (0, 3) (1, 2)
答案 0 :(得分:0)
对于任何想知道的人,我解决了这个问题。最终将每个边缘与最小的边缘进行多次比较,以找到绝对最小的边缘。如果不是负边缘,这种实现是正确的。我必须做的是删除while循环和q,然后在第一个循环之前添加2个循环以这种方式:
for i in range(len(length)):
for u in range(len(length)):
for v in range len(length[u]):
然后我继续使用剩下的代码。
这整个代码块已经过时了:
while len(q) > 0:
smaller = MAX_LENGTH
for i in q:
if dist[i] < smaller:
smaller = dist[i]
pos = i
u = q[q.index(pos)]
q.pop(q.index(pos))
if dist[u] == float('inf'):
break