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

Pythonでフォレストを接続するプログラム


隣接リストとしてグラフがあるとします。このグラフは、実際には互いに素なツリーのセットです。森が1本の木になるように、森に一定数のエッジを追加する必要があります。任意の2つのノード間の最長パスの可能な最小距離を返す必要があります。したがって、入力が次のような場合

Pythonでフォレストを接続するプログラム

その場合、出力は4になります。

エッジ0−> 5を追加できます。次に、最長のパスは3 −> 1 −> 0 −> 5 −>7または4−> 1 −> 0 −> 5 −>7のいずれかになります。また、方向が逆になっているこれらのパス。したがって、距離4を返します。

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

  • 見た:=新しいセット

  • dic:=グラフ

  • 関数treeDepth()を定義します。これはノードを取ります。

    • ret:=0

    • 関数dfs1()を定義します。これはノード、親を取ります。

      • セットにノードを追加します

      • best2:=空の最小ヒープ構造

      • dic [node]のnxtごとに、実行

        • nxtが親と同じでない場合、

          • push(dfs1(nxt、node)+ 1)into best2

        • len(best2)> 2の場合、

          • ヒープからポップ(best2)

        • best2が空の場合、

          • 0を返す

        • ret:=retの最大値、best2のすべての要素の合計

        • best2の最大値を返す

      • dfs1(node、null)

      • retを返す

  • メインの方法から、次のようにします-

  • ret:=0、opt:=新しいリスト、歌う:=0

    • 0からグラフのサイズまでの範囲のノードについては、次のようにします

      • ノードがseenに存在する場合、

        • 次のイテレーションに行く

      • res:=treeDepth(node)

      • 歌う:=歌う最大、解像度

      • optの最後に(res / 2)の天井を挿入します

    • optのサイズが<=1の場合、

      • 歌う

    • mx:=optの最大値

    • 0からoptのサイズまでの範囲のiの場合、実行します

      • opt [i]がmxと同じ場合、

        • opt [i]:=opt [i] − 1

        • ループから出てきます

    • 0からoptのサイズまでの範囲のiの場合、実行します

      • opt [i]:=opt [i] + 1

    • high2:=optからの最大の2つの要素。

    • sum(high2)の最大値を返し、歌う

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

import heapq, math
class Solution:
   def solve(self, graph):
      seen = set()
      dic = graph
      def treeDepth(node):
         self.ret = 0
         def dfs1(node, parent):
            seen.add(node)
            best2 = []
            for nxt in dic[node]:
               if nxt != parent:
                  heapq.heappush(best2, dfs1(nxt, node) + 1)
                  if len(best2) > 2:
                     heapq.heappop(best2)
            if not best2:
               return 0
            self.ret = max(self.ret, sum(best2))
            return max(best2)
         dfs1(node, None)
         return self.ret
      ret = 0
      opt = []
      sing = 0
      for node in range(len(graph)):
         if node in seen:
            continue
         res = treeDepth(node)
         sing = max(sing, res)
         opt.append(int(math.ceil(res / 2)))
      if len(opt) <= 1:
         return sing
      mx = max(opt)
      for i in range(len(opt)):
         if opt[i] == mx:
            opt[i] −= 1
            break
         for i in range(len(opt)):
            opt[i] += 1
         high2 = heapq.nlargest(2, opt)
         return max(sum(high2), sing)
ob = Solution()
graph = [
   [1, 2],
   [0,3,4],
   [0],
   [1],
   [1],
   [6,7],
   [5],
   [5]
]
print(ob.solve(graph))

入力

graph = [
   [1, 2],
   [0,3,4],
   [0],
   [1],
   [1],
   [6,7],
   [5],
   [5]
]

出力

4

  1. Pythonプログラムへの単純な関心

    この記事では、Python3.xでの単利の計算について学習します。またはそれ以前。 単純な関心 は、1日の利率に元本を掛け、支払いの間に経過した日数を掛けて計算されます。 数学的に 単利=(P x T x R)/ 100 どこで、 Pは元本です Tは時間であり Rはレートです たとえば、 P =1000の場合、R =1、T =2 次にSI=20.0 それでは、Pythonで単純な利息計算機を実装する方法を見てみましょう。 例 P = 1000 R = 1 T = 2 # simple interest SI = (P * R * T) / 100 print(&

  2. Pythonプログラムでの選択ソート

    この記事では、Python3.xでの選択ソートとその実装について学習します。またはそれ以前。 選択ソート アルゴリズムでは、配列は、ソートされていない部分から最小要素を再帰的に見つけて、それを先頭に挿入することによってソートされます。特定の配列での選択ソートの実行中に、2つのサブ配列が形成されます。 すでに並べ替えられているサブ配列。 ソートされていないサブアレイ。 選択ソートを繰り返すたびに、ソートされていないサブアレイの最小要素がポップされ、ソートされたサブアレイに挿入されます。 アルゴリズムの視覚的表現を見てみましょう- それでは、アルゴリズムの実装を見てみましょう-