1377. T 秒后青蛙的位置

发布时间 2023-04-12 16:50:15作者: zhangk1988

题目描述

n个顶点构成了无向树
顶点编号从1到n
给了跳跃规则(1)跳相临边(2)不往回跳(3)多个选择概率相同(4)叶子结点时候就停下来
问t秒后跳到目标顶点target上的概率?

f1-dfs

基本分析

  1. 怎么保证不往回跳?dfs时候传入父节点参数
  2. dfs怎么定义?当前在x,父节点是fa,步数是step时候到达当前节点的概率?

代码

class Solution:
    def frogPosition(self, n: int, edges: List[List[int]], t: int, target: int) -> float:
        g = defaultdict(list)
        for x, y in edges:
            g[x].append(y)
            g[y].append(x)
        
        # 当前概率,当前节点,传入父节点,步骤
        def dfs(p, x, fa, step):
            if step == t:
                if x == target:
                    return p
                return 0.0
            # 除了跟节点外,子节点个数都要-1
            cnt_child = len(g[x]) - 1 if x != 1 else len(g[x])
            # 子节点
            if cnt_child == 0:
                if x == target:
                    return p
                return 0
            # 其他情况
            # ans是左右分支中的最大值
            ans = 0
            for y in g[x]:
                if y != fa:
                    ans = max(ans, dfs(p * 1.0 / cnt_child, y, x, step + 1))
            return ans
        
        return dfs(1, 1, -1, 0)

总结

  1. 需要再消化下
f2-bfs

基本分析

  1. 怎么保证不往回跳?同样在状态的定义时,传入这个参数
  2. bfs什么时候返回?时间到找到了target或者到了target且不能走了
  3. 怎么控制bfs的流程?存在q+时间<=t

代码

class Solution:
    def frogPosition(self, n: int, edges: List[List[int]], t: int, target: int) -> float:

        g = defaultdict(list)
        for x, y in edges:
            g[x].append(y)
            g[y].append(x)
            
        step = 0
        q = deque([(1, -1, 1.0)])

        while q and step <= t:
            for _ in range(len(q)):
                # 当前节点,父节点,概率
                x, fa, p = q.popleft()
                if x == target and step == t:
                    return p
                chd_cnt = len(g[x]) - 1
                # 如果是1多减了一个,补回来
                if fa == -1:
                    chd_cnt += 1
                # 到达了叶子结点
                if chd_cnt == 0:
                    if x == target:
                        return p
                    continue
                # 继续传
                for y in g[x]:
                    if y != fa:
                        q.append((y, x, 1.0 * p / chd_cnt))
            step += 1
        
        return 0

总结

  1. 和dfs的不同?在没有找到的情况下,不返回