首页 > 试题广场 >

星球游戏

[编程题]星球游戏
  • 热度指数:228 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

牛牛和牛妹在进行一场星球模拟游戏,游戏规则如下:

游戏地图内共有n个星球,共有m条隧道连接这些星球。每条隧道都是双向的,每两个星球间不一定只有一条隧道。现在牛牛占领了这n个星球中的p个星球,牛妹占领了这n个星球中的q的星球(每个星球最多只能被一个人占领)。现在牛牛想知道他占领的p个星球中任意一个星球,到牛妹占领的q个星球中任意一个星球,这两个星球的最短距离是多少。

示例1

输入

[1],[3,4],[[1,2,7],[2,3,6],[3,4,2],[1,3,11],[2,4,3]],4

输出

10

说明

距离最近的牛牛星和牛妹星是1和4,他们之间的距离为10

示例2

输入

[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

发表于 2021-09-02 22:58:58 回复(2)

问题信息

难度:
1条回答 1661浏览

热门推荐

通过挑战的用户

查看代码