牛牛和牛妹在进行一场星球模拟游戏,游戏规则如下:
游戏地图内共有n个星球,共有m条隧道连接这些星球。每条隧道都是双向的,每两个星球间不一定只有一条隧道。现在牛牛占领了这n个星球中的p个星球,牛妹占领了这n个星球中的q的星球(每个星球最多只能被一个人占领)。现在牛牛想知道他占领的p个星球中任意一个星球,到牛妹占领的q个星球中任意一个星球,这两个星球的最短距离是多少。
牛牛和牛妹在进行一场星球模拟游戏,游戏规则如下:
[1],[3,4],[[1,2,7],[2,3,6],[3,4,2],[1,3,11],[2,4,3]],4
10
距离最近的牛牛星和牛妹星是1和4,他们之间的距离为10
[1],[2],[],2
-1
所有的牛牛星和牛妹星都不联通,故输出-1
对于50%的数据:对于100%的数据:相关参数意义如下serialP 牛牛占领的p个星球的编号
serialQ 牛妹占领的q个星球的编号
path m条隧道,每条隧道有三个数分别是ui,vi,wi。ui,vi分别是隧道的两边星球的编号,wi是它们之间的距离
nn int整型 星球个数n
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param serialP int一维数组 牛牛占领的p个星球的编号 # @param serialQ int一维数组 牛妹占领的q个星球的编号 # @param path int二维数组 m条隧道,每条隧道有三个数分别是ui,vi,wi。ui,vi分别是隧道的两边星球的编号,wi是它们之间的距离 # @param nn int 星球个数n # @return int # import collections,heapq class Solution: def Length(self , serialP , serialQ , path , nn ): # write code here edges = collections.defaultdict(set) dis = {} p,q = set(),set() queue = [] for x,y,v in path: if (x,y) in dis: dis[(x,y)] = min(dis[(x,y)],v) dis[(y,x)] = min(dis[(y,x)],v) else: edges[x].add(y) edges[y].add(x) dis[(x,y)] = v dis[(y,x)] = v for i in serialP: heapq.heappush(queue,[0,i]) p.add(i) for i in serialQ: q.add(i) d = {} while queue: D,cur = heapq.heappop(queue) if cur in q: return D for next_ in edges[cur]: if (cur,next_) not in d&nbs***bsp;d[(cur,next_)] > D + dis[(cur,next_)]: d[(cur,next_)] = D + dis[(cur,next_)] heapq.heappush(queue,[d[(cur,next_)],next_]) return -1