给定问题陈述的正确代码是什么?

问题描述 投票:0回答:1

给定一个由 n 个节点和一组强制访问的节点组成的无根无权树,我们必须从第一个节点开始遍历树,访问所有强制节点并在最后一个节点结束(因为上面示例中的第 5 个节点是最后一个节点) ).在所有这样的路径中,找到最小长度的路径并返回该路径的长度。给定一个由 n 个节点组成的无根无权树和一个长度为 m 的数组 VisitNodes[],找到从节点 1 到节点 n 的路径的最小长度,使得它至少访问访问节点 (以任何顺序) 中的所有节点一次。 因此,路径必须遵循给定的条件:

• 路径从节点 1 开始。

• 路径终止于节点 n。

• 路径可以访问每个节点任意次数。

• 在路径中,visitNodes 中的每个节点必须至少被访问一次。

• 从当前节点,可以移动到相邻节点。 例如: 边 = {{1, 2}, {1, 3}, {3,4}, {3,5}} 访问节点 = [2, 4] 输出:6

我尝试应用 dijkstra 算法,但得到错误的输出。

graph graph-theory depth-first-search breadth-first-search dijkstra
1个回答
0
投票
from collections import defaultdict, deque
from itertools import permutations
import heapq


def dijkstra_shortest_distance(start, graph):
    distances = {node: float('infinity') for node in graph}
    distances[start] = 0
    priority_queue = [(0, start)]

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor in graph[current_node]:
            distance = current_distance + 1  # +1 because it's unweighted
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances


def min_path_length(edges, visitNodes):
    # Convert edges to an adjacency list
    graph = defaultdict(list)
    for u, v in edges:
        graph[u].append(v)
        graph[v].append(u)

    # Calculate shortest paths between all pairs in visitNodes including node 1 and node n
    nodes_to_consider = [1] + visitNodes + [len(graph)]
    shortest_paths = defaultdict(dict)
    for node in nodes_to_consider:
        distances = dijkstra_shortest_distance(node, graph)
        for target in nodes_to_consider:
            shortest_paths[node][target] = distances[target]

    min_distance = float('inf')

    # Iterate through all permutations of visitNodes
    for perm in permutations(visitNodes):
        curr_distance = 0
        curr_node = 1
        for node in perm:
            curr_distance += shortest_paths[curr_node][node]
            curr_node = node
        curr_distance += shortest_paths[curr_node][len(graph)]
        min_distance = min(min_distance, curr_distance)

    return min_distance


edges = [(1, 2), (1, 3), (3, 4), (3, 5)]
visitNodes = [2, 4]
print(min_path_length(edges, visitNodes))  # Output: 6

我认为这应该有效。

© www.soinside.com 2019 - 2024. All rights reserved.