From 0db9e76b4128481a0a2b599c2dd59058fdaaadfc Mon Sep 17 00:00:00 2001 From: yenru0 Date: Wed, 2 Oct 2024 02:44:19 +0900 Subject: [PATCH] complete 4386.py 16402.py --- zeta_python/completed/16402.py | 45 ++++++++++++++++++++++++++++++ zeta_python/completed/4386.py | 50 ++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 zeta_python/completed/16402.py create mode 100644 zeta_python/completed/4386.py diff --git a/zeta_python/completed/16402.py b/zeta_python/completed/16402.py new file mode 100644 index 0000000..7753e1f --- /dev/null +++ b/zeta_python/completed/16402.py @@ -0,0 +1,45 @@ +import sys + +input = sys.stdin.readline + + +def find(deps, country) -> int: + a = country + while a != deps[a]: + a = deps[a] + return a + + +def union(deps, win, lose): + rw, rl = find(deps, win), find(deps, lose) + if rw == rl: + if rl == lose: + deps[rl] = win + deps[win] = win + else: + deps[rl] = rw + + +def get_sovereigns(N, deps): + return [i for i in range(N) if i == deps[i]] + + +if __name__ == "__main__": + N, M = map(int, input().split()) + name = [input().split()[2] for _ in range(N)] + name.sort() + name2index = {name[i]: i for i in range(N)} + index2name = [name[i] for i in range(N)] + + deps = [i for i in range(N)] + + for _ in range(M): + string_a, string_b, result = input().split(",") + name_a, name_b = string_a.split()[2], string_b.split()[2] + ia, ib = name2index[name_a], name2index[name_b] + result = int(result) + union(deps, ia, ib) if result == 1 else union(deps, ib, ia) + + sovereigns = get_sovereigns(N, deps) + print(len(sovereigns)) + [print(f"Kingdom of {index2name[i]}") for i in sovereigns] diff --git a/zeta_python/completed/4386.py b/zeta_python/completed/4386.py new file mode 100644 index 0000000..d73a4de --- /dev/null +++ b/zeta_python/completed/4386.py @@ -0,0 +1,50 @@ +import sys + +input = sys.stdin.readline + + +def dist(v1: tuple, v2: tuple) -> float: + return ((v1[0] - v2[0]) ** 2 + (v1[1] - v2[1]) ** 2) ** 0.5 + + +def find(conn, target): + a = target + while a != conn[a]: + a = conn[a] + + return a + + +def union(conn, a, b): + ra, rb = find(conn, a), find(conn, b) + if ra < rb: + conn[rb] = ra + else: + conn[ra] = rb + + +def get_MST(N: int, Es: list[tuple]) -> float: + Es.sort(key=lambda x: x[-1]) + connected = [i for i in range(N)] + + cnt = 0 + s = 0 + for a, b, w in Es: + if find(connected, a) != find(connected, b): + union(connected, a, b) + s += w + cnt += 1 + if cnt == N - 1: + break + return s + + +if __name__ == "__main__": + N = int(input()) + Vs = list(tuple(map(float, input().split())) for _ in range(N)) + + available_lines = [ + (i, j, dist(Vs[i], Vs[j])) for i in range(N - 1) for j in range(i + 1, N) + ] + + print(get_MST(N, available_lines))