给定一棵具有N个顶点和N-1个边的树。让我们定义一个函数F(a,b),它等于节点a和b之间的路径中的最小边缘权重。任务是计算所有此类F(a,b)的乘积。这里a&b是无序对,而a!= b。
因此,基本上,我们需要找到以下值:
其中0 <= i 在输入中,我们将得到N的值,然后是N-1行。每行包含3个整数u,v,w,表示节点u和v之间的边缘及其权重w。由于乘积将非常大,请以10 ^ 9 + 7为模输出。 如果我们仔细观察,就会发现如果有一组节点的最小边缘权重为w,并且向该集中添加了一个节点,该节点通过权重W的边缘将节点与整个集连接起来,使得W < w,则在最近添加的节点与集合中存在的所有节点之间形成的路径将具有最小权重W。 我们将乘积乘以树的所有边。 下面是上述方法的实现: 时间复杂度: O(N * logN)
例子: Input :
N = 4
1 2 1
1 3 3
4 3 2
Output : 12
Given tree is:
1
(1)/ \(3)
2 3
\(2)
4
We will calculate the minimum edge weight between all the pairs:
F(1, 2) = 1 F(2, 3) = 1
F(1, 3) = 3 F(2, 4) = 1
F(1, 4) = 2 F(3, 4) = 2
Product of all F(i, j) = 1*3*2*1*1*2 = 12 mod (10^9 +7) =12
Input :
N = 5
1 2 1
1 3 3
4 3 2
1 5 4
Output :
288
因此,在这里我们可以应用“不相交集并集”概念来解决该问题。
首先,根据递减的权重对数据结构进行排序。最初将所有节点分配为一个集合。现在,当我们合并两个集合时,请执行以下操作: Product=(present weight)^(size of set1*size of set2).
C++
// C++ Implementation of above approach
#include
Python3
# Python3 implementation of the approach
mod = 1000000007
# Function to return (x^y) mod p
def power(x: int, y: int, p: int) -> int:
res = 1
x %= p
while y > 0:
if y & 1:
res = (res * x) % p
y = y // 2
x = (x * x) % p
return res
# Declaring size array globally
size = [0] * 300005
freq = [0] * 300004
edges = []
# Initializing DSU data structure
def initialize(arr: list, N: int):
for i in range(N):
arr[i] = i
size[i] = 1
# Function to find the root of ith
# node in the disjoint set
def root(arr: list, i: int) -> int:
while arr[i] != i:
i = arr[i]
return i
# Weighted union using Path Compression
def weighted_union(arr: list, size: list, A: int, B: int):
root_A = root(arr, A)
root_B = root(arr, B)
# size of set A is small than size of set B
if size[root_A] < size[root_B]:
arr[root_A] = arr[root_B]
size[root_B] += size[root_A]
# size of set B is small than size of set A
else:
arr[root_B] = arr[root_A]
size[root_A] += size[root_B]
# Function to add an edge in the tree
def AddEdge(a: int, b: int, w: int):
edges.append((w, (a, b)))
# Bulid the tree
def makeTree():
AddEdge(1, 2, 1)
AddEdge(1, 3, 3)
AddEdge(3, 4, 2)
# Function to return the required product
def minProduct() -> int:
result = 1
# Sorting the edges with respect to its weight
edges.sort(key = lambda a: a[0])
# Start iterating in decreasing order of weight
for i in range(len(edges) - 1, -1, -1):
# Determine Curret edge values
curr_weight = edges[i][0]
node1 = edges[i][1][0]
node2 = edges[i][1][1]
# Calculate root of each node
# and size of each set
root1 = root(freq, node1)
set1_size = size[root1]
root2 = root(freq, node2)
set2_size = size[root2]
# Using the formula
prod = set1_size * set2_size
product = power(curr_weight, prod, mod)
# Calculating final result
result = ((result % mod) * (product % mod)) % mod
# Weighted union using Path Compression
weighted_union(freq, size, node1, node2)
return result % mod
# Driver Code
if __name__ == "__main__":
# Number of nodes and edges
n = 4
initialize(freq, n)
makeTree()
print(minProduct())
# This code is contributed by
# sanjeev2552
12