gpt4 book ai didi

python - python 上的生成树

转载 作者:行者123 更新时间:2023-11-30 22:39:44 25 4
gpt4 key购买 nike

我有这个硬件:

  1. 从文件中读取边缘列表
  2. 将其变成邻接表
  3. 输出图的未加权、无向生成树(我们可以假设起点位于顶点 0)

我无法正确输出 3.。也就是说,文件 1 应该输出 [[1],[0,2,3],[1],[1]] 并且我得到了 [[1,2],[0, 3],[0],[1]] 这还可以,因为它们都是文件 1 中 n=4 的生成树

但主要问题是:我不知道我的代码出了什么问题,对于文件 2:我得到:[[10], [], [10], [10], [], [ ]、[]、[]、[]、[]、[0、3、2]、[]、[]]

我的代码末尾的文件数据。(编辑:从 tree=[] 开始是问题所在,其余没有问题)

这是我解决这个问题的尝试:

import itertools

edge_i=[]
edge_j=[]
x = []
y = []
edgelist = []
n = int(input("Enter value for n:")) #input n for number of vertices
adjlist = [[] for i in range(n)] #create n sublists inside empty initial adjlist
data = [['0','1'],['2','1'],['0','2'],['1','3']]


for line in data: #for loop for appending into adjacency list the correct indices taken from out of the edgelist
#(this line won't be needed when hardcoding input) line = line.replace("\n","").split(" ")
for values in line:
values_as_int = int(values)
edgelist.append(values_as_int)



#set of vertices present in this file - pick out only n vertices
verticesset=set(edgelist)
listofusefulvertices=list(verticesset)[0:n]


P = list(itertools.permutations(listofusefulvertices,2))


x.append(edgelist[0::2])
y.append(edgelist[1::2])
x = sum(x,[])
y = sum(y,[])
dataint=zip(x,y)
datatuples=list(dataint)
outdata = set(datatuples)&set(P)
output=list(outdata)


for k in range(len(output)):
edge_i.append(output[k][0])
edge_i.append(output[k][1])
edge_j.append(output[k][1])
edge_j.append(output[k][0])

for i in range(len(edge_i)):
u = edge_i[i]
v = edge_j[i]
adjlist[u].append(v)
print(adjlist)


tree = []
for vertexNum in range(len(listofusefulvertices)):
tree.append([])
treeVertices = [0]*n
treeVertices[0]=1
for vertex in range(0,n): #(here the range in skeletal code from school used 1,n but it only worked for me when I used 0,n-1 or 0,n)
if treeVertices[vertex] == 1:
for adjVertex in adjlist[vertex]:
if treeVertices[adjVertex] == 0:
treeVertices[adjVertex]=1
tree[adjVertex].append(vertex)
tree[vertex].append(adjVertex)

print(tree)


#The data from files were: file 1: [['0','1'],['2','1'],['0','2'],['1','3']]
# file 2: [['10','2'],['7','4'],['11','3'],['1','12'],['6','8'],['10','3'],['4','9'],['5','7'],['8','12'],['2','11'],['1','6'],['0','10'],['7','2'],['12','5']]

最佳答案

我没有仔细阅读你所有的代码,你真的应该看看指南 Minimal, complete, verifiable example .

但是,将边列表转换为图,然后使用标准 mst 算法是相当简单的,例如普里姆的:

def create_graph(edgelist):
graph = {}
for e1, e2 in edgelist:
graph.setdefault(e1, []).append(e2)
graph.setdefault(e2, []).append(e1)
return graph

# Prim's
def mst(start, graph):
closed = set()
edges = []
q = [(start, start)]
while q:
v1, v2 = q.pop()
if v2 in closed:
continue
closed.add(v2)
edges.append((v1, v2))
for v in graph[v2]:
if v in graph:
q.append((v2, v))
del edges[0]
assert len(edges) == len(graph)-1
return edges

>>> graph = create_graph([[10, 2], [7, 4], [11, 3], [1, 12], [6, 8], [10, 3], [4, 9], [5, 7], [8, 12], [2, 11], [1, 6], [0, 10], [7, 2], [12, 5]])
>>> min_gragh = create_graph(mst(0, graph))
>>> min_graph
{0: [10],
1: [6],
2: [11, 7],
3: [10, 11],
4: [7, 9],
5: [7, 12],
6: [8, 1],
7: [2, 5, 4],
8: [12, 6],
9: [4],
10: [0, 3],
11: [3, 2],
12: [5, 8]}
>>> [sorted(min_graph[k]) for k in sorted(min_graph)]
[[10], [6], [7, 11], [10, 11], [7, 9], [7, 12], [1, 8], [2, 4, 5], [6, 12], [4], [0, 3], [2, 3], [5, 8]]

一个图可能有多个有效的 MST,例如您较小的 edgelist 生成 [[2], [2, 3], [0, 1], [1]],这也是一个有效的 MST,但与您的不同预期输出。

关于python - python 上的生成树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43057855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com