classSolution:deffrogPosition(self, n:int, edges: List[List[int]], t:int, target:int)->float:
g =[[]for _ inrange(n +1)]for x, y in edges:
g[x].append(y)
g[y].append(x)
g[1].append(0)
ans =0defdfs(x, fa, time, prod):if x == target and(time ==0orlen(g[x])==1):nonlocal ans
ans =1/ prod
returnTrueif x == target or time ==0:returnFalsefor y in g[x]:if y == fa:continueif dfs(y, x, time -1, prod *(len(g[x])-1)):returnTruereturnFalse
dfs(1,0, t,1)return ans
classSolution:defmostProfitablePath(self, edges: List[List[int]], bob:int, amount: List[int])->int:
n =len(amount)
g =[[]for _ inrange(n)]for x, y in edges:
g[x].append(y)
g[y].append(x)
g[0].append(-1)
bob_time =[n]* n
defdfs_bob(x:int, fa:int, t:int)->bool:if x ==0:
bob_time[x]= t
returnTruefor y in g[x]:if y != fa and dfs_bob(y, x, t +1):
bob_time[x]= t
returnTruereturnFalse
dfs_bob(bob,-1,0)
ans =-inf
defdfs_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]//2iflen(g[x])==1:nonlocal ans
ans =max(ans, tot)returnfor y in g[x]:if y != fa:
dfs_alice(y, x, alice_time +1, tot)
dfs_alice(0,-1,0,0)return ans