Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでノードを繰り返さずにDAGで最長のパスの長さを見つけるプログラム


隣接リストで表される有向非巡回グラフが1つあるとします。ノードを繰り返さずに、グラフ内で最長のパスを見つける必要があります。

したがって、入力が次のような場合

Pythonでノードを繰り返さずにDAGで最長のパスの長さを見つけるプログラム

パスが0->1->3-> 4-> 2、長さが4であるため、出力は4になります。

これを解決するには、次の手順に従います-

  • ans:=0
  • n:=グラフのノード数
  • table:=サイズnのリストで、-1で埋めます
  • 関数dfs()を定義します。これには時間がかかります
  • table [u]が-1でない場合、
    • リターンテーブル[u]
  • p_len:=0
  • グラフ[u]の各vectexvについて、
      を実行します。
    • p_len:=最大p_lenおよび(1 + dfs(v))
  • table [u]:=p_len
  • return p_len
  • メインメソッドから次の手順を実行します-
  • 0からnの範囲のiについては、
    • ans:=ansの最大値、dfs(i)
  • 回答を返す

例(Python)

理解を深めるために、次の実装を見てみましょう-

class Solution:
   def solve(self, graph):
      ans = 0
      n = len(graph)
      table = [-1] * n
      def dfs(u):
         if table[u] != -1:
            return table[u]
         p_len = 0
         for v in graph[u]:
            p_len = max(p_len, 1 + dfs(v))
         table[u] = p_len
         return p_len
      for i in range(n):
         ans = max(ans, dfs(i))
      return ans
ob = Solution()
graph = [
   [1, 2],
   [3, 4],
   [],
   [4],
   [2],
]
print(ob.solve(graph))

入力

graph = [[1, 2],[3, 4],[],[4],[2]]

出力

4

  1. Pythonでバイナリツリーの最長の連続パスの長さを見つけるプログラム

    二分木があるとしましょう。二分木で最長のパスを見つける必要があります。 したがって、入力が次のような場合 連続する最長のシーケンスが[2、3、4、5、6]であるため、出力は5になります。 これを解決するには、次の手順に従います- rootがnullの場合、 0を返す maxPath:=0 関数helper()を定義します。これはノードを取ります inc:=1、dec:=1 ノードの左側がnullでない場合、 [left_inc、left_dec]:=ヘルパー(ノードの左側) それ以外の場合、 [left_inc、left_dec]:=[0、0] ノード

  2. Pythonで二分木の最長交互パスの長さを見つけるプログラム

    二分木があるとすると、左と右の子を交互に繰り返して下る最長のパスを見つける必要があります。 したがって、入力が次のような場合 交互のパスが[2、4、5、7、8]であるため、出力は5になります。 これを解決するには、次の手順に従います。 rootがnullの場合、 0を返す 関数dfs()を定義します。これには、ノード、カウント、フラグが必要です ノードがnullでない場合、 フラグがTrueと同じ場合、 a:=dfs(ノードの左側、カウント+ 1、False) b:=dfs(ノードの右側、1、True) それ以外の場合、フラグがFalseと同じ場合、 a:=dfs