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

Pythonのサブツリーのノード値の合計から最小値を見つけるプログラム


すべてのノードに1からnまでの番号が付けられたツリーがあるとします。各ノードには整数値が含まれています。ここで、ツリーからエッジを削除する場合、2つのサブツリーのノード値の合計の差を最小限に抑える必要があります。そのようなサブツリー間の最小の違いを見つけて返す必要があります。ツリーはエッジのコレクションとして提供され、ノードの値も提供されます。

したがって、入力がn =6の場合、edge_list =[[1、2]、[1、3]、[2、4]、[3、5]、[3、6]]、values =[15、 25、15、55、15、65]の場合、出力は0になります。

Pythonのサブツリーのノード値の合計から最小値を見つけるプログラム

エッジ(1,2)を削除すると、重みの合計は80、110になります。差は30です。

エッジ(1,3)を削除すると、重みの合計は95、95になります。差は0です。

エッジ(2,4)を削除すると、重みの合計は55、135になります。差は80です。

エッジ(3,5)を削除すると、重みの合計は15、175になります。差は160です。

エッジ(3,6)を削除すると、重みの合計は65、125になります。差は60です。

したがって、最小の重みは0です。

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

  • adj_list:=空のリストを含むサイズnの新しいリスト
  • edge_listの各エッジについて、実行します
    • u:=edge [0]
    • v:=edge [1]
    • adj_list [u-1]
    • の最後にv-1を挿入します
    • adj_list[v-1]の最後にu-1を挿入します
  • value_list:=0で初期化されたサイズnの新しいリスト
  • not_visited:=サイズiの新しいマップ。ここで、iはadj_list内の空でないリストの数です
  • not_visitedが空ではない場合は、
    • not_visitedの各iについて、
      • value_list [i]:=value_list [i] + values [i]
      • (adj_list [i])の長さがゼロ以外の場合、
        • adj_list [adj_list [i、0]]からiを削除します
        • value_list [adj_list [i、0]]:=value_list [adj_list [i、0]] + value_list [i]
    • not_visitedの各iについて、
      • len(adj_list [i])およびlen(adj_list [adj_list [i、0]])==1の場合、
        • not_visited:=adj_list [i、0]を含む新しいリスト
  • return_val:=| sum(values)-2 * value_list [0] |
  • 1からnの範囲のiについては、
    • decision_val:=| sum(values)-2 * value_list [i] |
    • Decision_val
    • return_val:=decision_val
  • return return_val
  • 理解を深めるために、次の実装を見てみましょう-

    def solve(n, edge_list, values):
       adj_list = [[] for i in range(n)]
    
       for edge in edge_list:
          u = edge[0]
          v = edge[1]
          adj_list[u-1].append(v-1)
          adj_list[v-1].append(u-1)
    
       value_list = [0] * n
       not_visited = {i for i in range(n) if len(adj_list[i]) == 1}
       while(len(not_visited)):
          for i in not_visited:
             value_list[i] += values[i]
             if(len(adj_list[i])):
                adj_list[adj_list[i][0]].remove(i)
                value_list[adj_list[i][0]] += value_list[i]
          not_visited = {adj_list[i][0] for i in not_visited if
             len(adj_list[i]) and len(adj_list[adj_list[i][0]]) == 1}
       return_val = abs(sum(values) - 2 * value_list[0])
    
       for i in range(1, n):
          decision_val = abs(sum(values) - 2 * value_list[i])
          if decision_val < return_val:
             return_val = decision_val
       return return_val
    
    print(solve(6, [[1, 2], [1, 3], [2, 4], [3, 5], [3, 6]], [10, 20, 10, 50, 10, 60]))

    入力

    6, [[1, 2], [1, 3], [2, 4], [3, 5], [3, 6]], [10, 20, 10, 50, 10, 60]

    出力

    0

    1. Pythonプログラムで配列の合計を見つける

      この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −配列の合計を計算するために必要な配列が与えられます。 合計を取得するために各インデックスで配列と要素全体をトラバースするブルートフォースアプローチについては、以下で説明します。合計を取得するための各インデックスについては、以下で説明します。 例 # sum function def sum_(arr,n):    # using built-in function    return(sum(arr)) # main arr = [11,22,33,44,55,66

    2. 配列の合計を見つけるPythonプログラム

      この記事では、特定の問題ステートメントを解決するための解決策とアプローチについて学習します。 問題の説明 入力として配列が与えられた場合、与えられた配列の合計を計算する必要があります。 ここでは、ブルートフォースアプローチに従うことができます。つまり、リストをトラバースし、各要素を空の合計変数に追加します。最後に、合計の値を表示します。 以下で説明するように、組み込みの合計関数を使用して別のアプローチを実行することもできます。 例 # main arr = [1,2,3,4,5] ans = sum(arr,n) print ('Sum of the array is '