問題の説明
アイデアとコード
オントロジーは公式の問題解決法を参照し、深さ優先探索によって解決します:
LeetCode 2065 公式問題解決法
次の 2 点に注意してください。
- 特定のノードに繰り返し到達する場合、繰り返し値を取得することはできません。
- 始点が孤立点の場合は、そのまま戻ります。
コードは以下のように表示されます:
class Solution:
def maximalPathQuality(self, values: List[int], edges: List[List[int]], maxTime: int) -> int:
# node to (node, time) list dictionary
dict_node_edge = {
}
for i, j, t in edges:
if i not in dict_node_edge.keys():
dict_node_edge[i] = [(j, t)]
else:
dict_node_edge[i].append((j, t))
if j not in dict_node_edge.keys():
dict_node_edge[j] = [(i, t)]
else:
dict_node_edge[j].append((i, t))
set_node_visit = {
0}
ans = 0
def dfs(node: int, time: int, value: int) -> None:
nonlocal ans
if node == 0:
ans = max(ans, value)
if node not in dict_node_edge.keys():
return
for node_next, time_cost in dict_node_edge[node]:
if time + time_cost <= maxTime:
if node_next not in set_node_visit:
set_node_visit.add(node_next)
dfs(node=node_next, time=time + time_cost, value=value + values[node_next])
set_node_visit.remove(node_next)
else:
dfs(node=node_next, time=time + time_cost, value=value)
dfs(node=0, time=0, value=values[0])
return ans
その中で、dict_node_edge ディクショナリが defaultdict 型を使用する場合、その特性を使用でき、公式の解決策に示されているように、開始点が孤立点である場合に特別な処理を実行する必要はありません。
class Solution:
def maximalPathQuality(self, values: List[int], edges: List[List[int]], maxTime: int) -> int:
g = defaultdict(list)
for x, y, z in edges:
g[x].append((y, z))
g[y].append((x, z))
visited = {
0}
ans = 0
def dfs(u: int, time: int, value: int) -> None:
if u == 0:
nonlocal ans
ans = max(ans, value)
for v, dist in g[u]:
if time + dist <= maxTime:
if v not in visited:
visited.add(v)
dfs(v, time + dist, value + values[v])
visited.discard(v)
else:
dfs(v, time + dist, value)
dfs(0, 0, values[0])
return ans
しかし、著者の通常のコードの習慣によると、defaultdict の予期しないキーの副作用を避けるため、この型は使用しません。
著者のコードは次のように機能します。
拡張された思考
この問題の考え方は、グリッド マップのパスの問題、つまり、各グリッド ポイントに到達するコストまたは利益が異なるという問題を解決するためにも使用できますが、この時点では、元の A* アルゴリズムでは解決できません。 、およびこの質問の方法のみを使用して検索できます。しかし問題は、探索空間が本質的に大きすぎることであり、広いエリアで最適な経路探索を完了することは困難です。