-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathIITWPC41.py
74 lines (55 loc) · 1.69 KB
/
IITWPC41.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
class Edge:
def __init__(self, u, v, weight):
self.u = u
self.v = v
self.weight = weight
class DisjointSet:
def __init__(self, n):
self.parent = [None] * n
self.size = [1] * n
for i in range(n):
self.parent[i] = i
def merge_set(self, a, b):
a = self.find_set(a)
b = self.find_set(b)
if self.size[a] < self.size[b]:
self.parent[a] = b
self.size[b] += self.size[a]
else:
self.parent[b] = a
self.size[a] += self.size[b]
def find_set(self, a):
if self.parent[a] != a:
self.parent[a] = self.find_set(self.parent[a])
return self.parent[a]
def kruskal(n, edges, ds):
edges.sort(key=lambda edge: edge.weight)
mst = []
for edge in edges:
set_u = ds.find_set(edge.u)
set_v = ds.find_set(edge.v)
if set_u != set_v :
ds.merge_set(set_u, set_v)
mst.append(edge)
if len(mst) == n-1:
break
return sum([edge.weight for edge in mst])
if __name__ == '__main__':
for _ in range(int(input())):
n, m = map(int, input().split())
doodhwala = list(map(int, input().split()))
edges = []
ds = DisjointSet(m)
for z in range(m):
u, v, weight = map(int, input().split())
u = u-1
v = v-1
if doodhwala[u]==1:
edges.append(Edge(n,u,0))
elif doodhwala[v]==1:
edges.append(Edge(n,v,0))
else:
edges.append(Edge(u, v, weight))
print(edges)
ans = kruskal(n, edges, ds)
print(ans)