কম্পিউটার টিউটোরিয়াল

পাইথনে ট্রি থেকে একটি এজ কাট করে দুটি সাবট্রিের নোড ভ্যালু সামের পার্থক্য মিনিমাইজ করা

n নোডবালা একটি ট্রি দেওয়া আছে (নোড ১ থেকে n)। প্রতিটি নোডের একটি ইন্টিজার ভ্যালু আছে। একটি এজ কাট করলে দুটি সাবট্রি বने। তাদের নোড ভ্যালু সামের পার্থক্য ন্যূনতম করতে হবে। এই ন্যূনতম পার্থক্য বের করতে হবে।

উদাহরণ

ইনপুট: n = 6, edges = [[1,2],[1,3],[2,4],[3,5],[3,6]], values = [15,25,15,55,15,65]

আউটপুট: 0

এজ (1,3) কাট করলে দুটি সাবট্রির সাম ৯৫ এবং ৯৫ → পার্থক্য ০।

সমাধান পদ্ধতি

  1. অ্যাডজেসেন্সি লিস্ট বানান।
  2. লিফ নোডগুলো থেকে শুরুরে বটম-আপ DP করুন।
  3. প্রতিটি নোডের সাবট্রি সাম ক্যালকুলেট করুন।
  4. প্রতিটি নোড i (রুট বাদে) এর জন্য পার্থক্য = |total_sum - 2 * subtree_sum[i]|।
  5. মিনিমাম পার্থক্য রিটার্ন করুন।

পাইথন ইমপ্লিমেন্টেশন

def solve(n, edge_list, values):
    adj_list = [[] for _ in range(n)]
    for u, v in edge_list:
        adj_list[u-1].append(v-1)
        adj_list[v-1].append(u-1)
    subtree_sum = [0] * n
    visited = [False] * n
    def dfs(u):
        visited[u] = True
        s = values[u]
        for v in adj_list[u]:
            if not visited[v]:
                s += dfs(v)
        subtree_sum[u] = s
        return s
    total = dfs(0)
    min_diff = float('inf')
    for i in range(1, n):
        diff = abs(total - 2 * subtree_sum[i])
        if diff < min_diff:
            min_diff = diff
    return min_diff

# টেস্ট
print(solve(6, [[1,2],[1,3],[2,4],[3,5],[3,6]], [10,20,10,50,10,60]))  # আউটপুট: 0

ইনপুট

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

আউটপুট

0
  1. পাইথনে গ্রাফে সর্বোচ্চ ক্লিকের ন্যূনতম আকার বের করার প্রোগ্রাম

  2. পাইথনে ফেরিস হইল থেকে সর্বোচ্চ প্রফিট পাওয়ার ন্যূনতম রোটেশন বের করার প্রোগ্রাম

  3. পাইথন প্রোগ্রামে অ্যারের যোগফল বের করা

  4. পাইথনে অ্যারের যোগফল বের করা