0

나는 Krusal의 알고리즘을 연구 중이다. 그러나 나는 올바른 결과물을 얻는데 실패했다. 내가 어디에서 착각했는지 나는 모른다. 여기 파이썬에서 Kruskal 알고리즘 구현에서 잘못된 출력

내 코드입니다 : 내가 찾은

parent = dict() 
rank = dict() 

def make_set(vertice): 
    parent[vertice] = vertice 
    rank[vertice] = 0 

def find(vertice): 
    if parent[vertice] != vertice: 
     parent[vertice] = find(parent[vertice]) 
    return parent[vertice] 

def union(vertice1, vertice2): 
    root1 = find(vertice1) 
    root2 = find(vertice2) 
    if root1 != root2: 
     if rank[root1] > rank[root2]: 
      parent[root2] = root1 
     else: 
      parent[root1] = root2 
      if rank[root1] == rank[root2]: rank[root2] += 1 

def kruskal(graph): 
    for vertice in graph['vertices']: 
     make_set(vertice) 

    minimum_spanning_tree = set() 
    edges = list(graph['edges']) 

    for edge in edges: 
     vertice1, vertice2, weight = edge 
     if find(vertice1) != find(vertice2): 
      union(vertice1, vertice2) 
      minimum_spanning_tree.add(edge) 
    return minimum_spanning_tree 






graph = { 
    'vertices': [0,1, 2, 3, 4, 5], 
    'edges': set([  //(first node, second node, weight) 
     (0, 3,5), 
     (3, 5,2), 
     (5, 4,10), 
     (4, 1,3), 
     (1, 0,8), 
     (0, 2,1),(2,3,6),(2,5,4),(2,4,9),(2,1,7), 
     ]) 
    } 

a = kruskal(graph) 

print(a) 

내가 (무게, 첫 번째 노드, 두 번째 노드) 형식으로 "가장자리"를 변경하면, 내가 할 수있는 (무게의 형식으로 정답을 가지고, 첫 번째 노드 그 , 제 2 노드). 하지만 "가장자리"를 (첫 번째 노드, 두 번째 노드, weigth) 형식으로 사용하려면 어떻게 수정해야합니까?

+0

하십시오 [편집] 당신이 기대했던 출력을 포함하는 질문. 내 추측에 의하면 그것은 [(0, 2, 1), (3,5,2), (4,1,3), (2, 5, 4), (2, 1, 7)] '(전체 그래프 55에서 17). 옳은? –

답변

0

언뜻보기에,이 시도 :

edges = list(graph['edges']) 

대신

edges = sorted(graph['edges'], key=lambda e: e[2]) 
+0

나중에이 Q & A를 찾는 사람을 명확히하기 위해 : [Kruskal의 알고리즘] (https://en.wikipedia.org/wiki/Kruskal's_algorithm)의 핵심은 가장 적은 가중치에서부터 가장 큰 것 순으로 에지를 테스트하는 것입니다. Running.Pig의'kruskal' 함수는'graph [ 'edges']'집합에서 나온 순서대로 시도했습니다. –