class Solution:
def frogPosition(self, n: int, edges: List[List[int]], t: int, target: int) -> float:
g = [[] for _ in range(n + 1)]
for x, y in edges:
g[x].append(y)
g[y].append(x)
g[1].append(0)
ans = 0
def dfs(x, fa, time, prod):
if x == target and (time == 0 or len(g[x]) == 1):
nonlocal ans
ans = 1 / prod
return True
if x == target or time == 0: return False
for y in g[x]:
if y == fa: continue
if dfs(y, x, time - 1, prod * (len(g[x]) - 1)): return True
return False
dfs(1, 0, t, 1)
return ans
class Solution:
def mostProfitablePath(self, edges: List[List[int]], bob: int, amount: List[int]) -> int:
n = len(amount)
g = [[] for _ in range(n)]
for x, y in edges:
g[x].append(y)
g[y].append(x)
g[0].append(-1)
bob_time = [n] * n
def dfs_bob(x: int, fa: int, t: int) -> bool:
if x == 0:
bob_time[x] = t
return True
for y in g[x]:
if y != fa and dfs_bob(y, x, t + 1):
bob_time[x] = t
return True
return False
dfs_bob(bob, -1, 0)
ans = -inf
def dfs_alice(x: int, fa: int, alice_time: int, tot: int) -> None:
if alice_time < bob_time[x]:
tot += amount[x]
elif alice_time == bob_time[x]:
tot += amount[x] // 2
if len(g[x]) == 1:
nonlocal ans
ans = max(ans, tot)
return
for y in g[x]:
if y != fa:
dfs_alice(y, x, alice_time + 1, tot)
dfs_alice(0, -1, 0, 0)
return ans