LeetCode 2065. グラフの最大パス品質 (グラフ内のパス値を最大化)

問題の説明

問題記述Ⅰ
問題の説明 II
問題解説Ⅲ
問題の説明 IV
問題の説明 V.

アイデアとコード


オントロジーは公式の問題解決法を参照し、深さ優先探索によって解決します:
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* アルゴリズムでは解決できません。 、およびこの質問の方法のみを使用して検索できます。しかし問題は、探索空間が本質的に大きすぎることであり、広いエリアで最適な経路探索を完了することは困難です。

おすすめ

転載: blog.csdn.net/Zhang_0702_China/article/details/124286506