complete correct 1197.py
This commit is contained in:
@@ -3,48 +3,46 @@ import sys
|
|||||||
input = sys.stdin.readline
|
input = sys.stdin.readline
|
||||||
|
|
||||||
|
|
||||||
def find(P, a) -> int:
|
class MinimumSpanningTree:
|
||||||
node = a
|
def __init__(self, V: int, E: int, edges: list[tuple[int]]):
|
||||||
while node != P[node]:
|
self.V = V
|
||||||
node = P[node]
|
self.E = E
|
||||||
|
self.edges: list[tuple[int]] = edges
|
||||||
|
|
||||||
|
self.edges.sort(key=lambda x: x[2])
|
||||||
|
self.__parents = [i for i in range(self.V + 1)]
|
||||||
|
|
||||||
|
def __root(self, x: int) -> int:
|
||||||
|
node = x
|
||||||
|
while node != self.__parents[node]:
|
||||||
|
node = self.__parents[node]
|
||||||
return node
|
return node
|
||||||
|
|
||||||
|
def __union(self, x: int, y: int):
|
||||||
def union(P, a, b) -> None:
|
rx = self.__root(x)
|
||||||
ra = find(P, a)
|
ry = self.__root(y)
|
||||||
rb = find(P, b)
|
if rx > ry:
|
||||||
if ra < rb:
|
self.__parents[ry] = rx
|
||||||
P[rb] = ra
|
|
||||||
else:
|
else:
|
||||||
P[ra] = rb
|
self.__parents[rx] = ry
|
||||||
|
|
||||||
|
def solve(self):
|
||||||
|
mst = []
|
||||||
|
for e in self.edges:
|
||||||
|
a = e[0]
|
||||||
|
b = e[1]
|
||||||
|
if self.__root(a) == self.__root(b):
|
||||||
|
continue
|
||||||
|
mst.append(e)
|
||||||
|
self.__union(a, b)
|
||||||
|
|
||||||
def two_of_them(P, a, b) -> bool:
|
if len(mst) == self.V - 1:
|
||||||
return find(P, a) == find(P, b)
|
|
||||||
|
|
||||||
|
|
||||||
def get_MST(V, E, Es) -> int:
|
|
||||||
# sort Edges
|
|
||||||
Es.sort(key=lambda x: x[-1])
|
|
||||||
|
|
||||||
P = [i for i in range(V + 1)]
|
|
||||||
cum_edges = []
|
|
||||||
for ei in range(E):
|
|
||||||
s, e, w = Es[ei]
|
|
||||||
if not two_of_them(P, s, e):
|
|
||||||
cum_edges.append(w)
|
|
||||||
union(P, s, e)
|
|
||||||
if len(cum_edges) == V - 1:
|
|
||||||
break
|
break
|
||||||
|
return sum(map(lambda x: x[2], mst))
|
||||||
return sum(cum_edges)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
V, E = map(int, input().split())
|
V, E = map(int, input().split())
|
||||||
Es = []
|
edges = [tuple(map(int, input().split())) for _ in range(E)]
|
||||||
for _ in range(E):
|
solver = MinimumSpanningTree(V, E, edges)
|
||||||
start, end, weight = map(int, input().split())
|
print(solver.solve())
|
||||||
Es.append((start, end, weight))
|
|
||||||
|
|
||||||
print(get_MST(V, E, Es))
|
|
||||||
|
|||||||
Reference in New Issue
Block a user