题目描述
n个顶点构成了无向树
顶点编号从1到n
给了跳跃规则(1)跳相临边(2)不往回跳(3)多个选择概率相同(4)叶子结点时候就停下来
问t秒后跳到目标顶点target上的概率?
基本分析
- 怎么保证不往回跳?dfs时候传入父节点参数
- 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 |
| |
| 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 = 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) |
总结
- 需要再消化下
基本分析
- 怎么保证不往回跳?同样在状态的定义时,传入这个参数
- bfs什么时候返回?时间到找到了target或者到了target且不能走了
- 怎么控制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 |
| |
| 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 |
总结
- 和dfs的不同?在没有找到的情况下,不返回
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现