Uriel's Corner

Research Associate @ Harvard University / Research Interests: Computer Vision, Biomedical Image Analysis, Machine Learning
posts - 0, comments - 50, trackbacks - 0, articles - 594
给出一个有向图每个节点的链接情况(graph[i]表示与节点i相连的节点),问最少走过多少跳变可以遍历所有节点,BFS,用二进制mask记录走过的节点,vis[bit_mask][node]=1记录已经走过bit_mask中存储的节点,并且最后刚刚经过node节点


 1 #847
 2 #Runtime: 76 ms (Beats 100%)
 3 #Memory: 14.2 MB (Beats 87.50%)
 4 
 5 class Solution(object):
 6     def shortestPathLength(self, graph):
 7         """
 8         :type graph: List[List[int]]
 9         :rtype: int
10         """
11         n = len(graph)
12         vis_mask = (1 << n) - 1
13         q = deque()
14         vis = [[0] * n for _ in range(vis_mask + 1)]
15         for x in xrange(n):
16             ini_mask = 1 << x
17             q.append((x, ini_mask, 1))
18             vis[ini_mask][x] = 1
19         while q:
20             t = q.popleft()
21             cur_node, cur_mask, cur_len = t
22             if cur_mask == vis_mask:
23                 return cur_len - 1
24             for nei in graph[cur_node]:
25                 new_mask = cur_mask | (1 << nei)
26                 if vis[new_mask][nei]:
27                     continue
28                 q.append((nei, new_mask, cur_len + 1))
29                 vis[new_mask][nei] = 1
30         return -1

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理