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

Pythonのバイナリ行列で最大パス長を見つける


この問題では、各要素が0または1のいずれかでサイズmXnの正方行列mat[][]が与えられます。要素の値が1の場合、これは接続されていることを意味し、値が0の場合、これは接続されていません。私たちのタスクは、バイナリ行列で最大パス長を見つけることです。

問題の説明 −問題を解決するには、マトリックス上で最大の長さのパスを見つける必要があります。これは、マトリックス内の1つの要素すべてを意味します。パスを見つける前に、最大で1つを0から1に変換します。

問題を理解するために例を見てみましょう

入力

mat[][] = {{1, 0},
{0, 1}}

出力

3

説明

We can convert 0 at index (0, 1) or (1, 0) to maximise the path length.

ソリューションアプローチ

この問題の簡単な解決策は、各0を1に変換した後に長さを見つけることです。まず深さ優先探索を使用してパスの長さを見つけ、次にすべてのパスの長さの最大値を返します。

効率的な解決策は、複数の変換を行う必要をなくし、最も有望な解決策を提供するものに落ち着くことです。 1つを0から1に切り替えると、最大の長さのパスが返されるようなグループが見つかります。

ソリューションの動作を説明するプログラム

def FindNeighbor(R, C, N):
   for nr, nc in (((R - 1), C), ( (R + 1) , C), (R, (C - 1) ), (R, (C + 1) )):
      if 0 <= nr < N and 0 <= nc < N:
         yield nr, nc

def DFSTraversal(R, C, index, mat, N):
   maxLen = 1
   mat[R][C] = index
   for nr, nc in FindNeighbor(R, C, N):
      if mat[nr][nc] == 1:
         maxLen += DFSTraversal(nr, nc, index)

   return maxLen


def findLargestPath(mat):

   N = len(mat)
   maxPath = {}
   index = 2

   for i in range(N):
      for j in range(N):
         if mat[i][j] == 1:
            maxPath[index] = DFSTraversal(i, j, index, mat, N)
            index += 1

   maxPathLen = max(maxPath.values() or [0])

   for i in range(N):
      for j in range(N):
         if mat[i][j] == 0:
            seen = {mat[nr][nc] for nr, nc in FindNeighbor(i, j, N) if mat[nr][nc] > 1}
            maxPathLen = max(maxPathLen, 1 + sum(maxPath[i] for i in seen))

   return maxPathLen
I = [[1, 0], [0, 1]]
print("The length of largest path is " + str(findLargestPath(I)))

出力

The length of largest path is 3

  1. Pythonで二分木の最大幅を見つけるプログラム

    二分木があるとすると、ツリー内の任意のレベルの最大幅を見つける必要があります。ここで、レベルの幅は、左端のノードと右端のノードの間に保持できるノードの数です。 したがって、入力がのような場合 その場合、出力は2になります これを解決するために、次の手順に従います- マップdを作成し、最小値と最大値を保持するには、最小値は最初は無限大で、最大値は0です 関数dfs()を定義します。これはルートを取ります、pos:=0、depth:=0 ルートがnullの場合、戻り値はありません d [depth、0] =d [depth、0]とposの最小値 d [d

  2. Pythonでの二分木最大パス合計

    空でない二分木が1つあるとします。パスの合計を見つける必要があります。したがって、ここでのパスとは、開始ノードから親子接続が存在するノードまでのノードのシーケンスです。パスには少なくとも1つのノードが含まれている必要があり、ルートノードを通過する必要はありません。したがって、入力ツリーが-の場合 ここで、出力は32になります。 これを解決するには、次の手順に従います- solve()と呼ばれる1つのメソッドを定義します。これはノードを取ります nodeがnullまたはnodeの値が0の場合、0を返します left:=最大0およびsolve(ノードの左側) ri