847. 访问所有节点的最短路径(无向连通图的最短路径)

无向连通图的最短路径!!!

参考:https://www.cnblogs.com/MrSaver/p/9465181.html

在这里插入图片描述

思路:
from collections import deque, namedtuple

class Solution(object):
    def shortestPathLength(self, graph):
        """
        :type graph: List[List[int]]
        :rtype: int
        """
        GraphNode = namedtuple('GraphNode',['id','nodes_visited'])
        N = len(graph)  # 总的结点个数
        q = deque()  # 用队列实现广度优先搜索
        # 起始节点
        for n in range(N):
            q.append(GraphNode(n, 1<<n)) # 1<<n 意思就是1按位左移n个单位
        # 所有节点
        all_nodes = 0
        for i in range(N):
            all_nodes = all_nodes | (1<<i) # 把1左移i位
        # 记录已经访问过的状态
        states_seen = [[ 0 for j in range(pow(2, N))] for i in range(N)]

        # 当前已经访问的长度
        path_length = 0
        while q:
            # 当前层的队列长度
            nq = len(q)
            while nq:
                nq = nq - 1
                cur_node = q.popleft()
                # 判断是否已经访问了所有的节点
                if cur_node.nodes_visited == all_nodes:
                    return path_length
                # 邻接节点
                neighbours = graph[cur_node.id]
                for id in neighbours:
                    nodes_visited = cur_node.nodes_visited
                    # 添加已访问的节点
                    nodes_visited = nodes_visited | (1<<id)
                    # 判断当前的状态是否访问过,若有则跳过,若没有则添加到队列并且更新状态
                    if states_seen[id][nodes_visited]:
                        continue
                    states_seen[id][nodes_visited] = 1
                    q.append(GraphNode(id, nodes_visited))
            path_length = path_length + 1
        return -1

猜你喜欢

转载自blog.csdn.net/zyy848877920/article/details/89195064