ABC049 D - 連結
https://atcoder.jp/contests/abc049/tasks/arc065_b
提出
code: python
n, k, l = map(int, input().split())
pq = list(map(int, input().split())) for _ in range(k)
rs = list(map(int, input().split())) for _ in range(l)
road = [[] for _ in range(n)]
rail = [[] for _ in range(n)]
for i in pq:
road[i0-1].append(i1-1)
road[i1-1].append(i0-1)
for i in rs:
rail[i0-1].append(i1-1)
rail[i1-1].append(i0-1)
class UnionFind:
def __init__(self, n):
# 親要素のノード番号を格納。parx == xの時そのノードは根(最初は全て根)
self.par = i for i in range(n)
# 木の高さを格納する(初期状態では0)
self.rank = 0 * n
# 人間の数
self.size = 1 * n
# 検索
def find(self, x):
# 根ならその番号を返す
if self.parx == x:
return x
# 根でないなら、親の要素で再検索
else:
# 走査していく過程で親を書き換える(return xが代入される)
self.parx = self.find(self.parx)
return self.parx
# 併合
def union(self, x, y):
# 根を探す
x = self.find(x)
y = self.find(y)
if x == y:
return
# 木の高さを比較し、低いほうから高いほうに辺を張る
if self.rankx < self.ranky:
self.parx = y
self.sizey += self.sizex
else:
self.pary = x
self.sizex += self.sizey
# 木の高さが同じなら片方を1増やす
if self.rankx == self.ranky:
self.rankx += 1
# 同じ集合に属するか判定
def same(self, x, y):
return self.find(x) == self.find(y)
UF = UnionFind(n)
解答
code: python
from collections import Counter
n, k, l = map(int, input().split())
pq = list(map(int, input().split())) for _ in range(k)
rs = list(map(int, input().split())) for _ in range(l)
# print(pq)
# 1, 2], 2, 3, [3, 4
# print(rs)
# 2, 3
class UnionFind:
def __init__(self, n):
self.parent = i for i in range(n)
self.rank = 0 * n
self.size = 1 * n
def root(self, x):
if self.parentx == x:
return x
else:
self.parentx = self.root(self.parentx)
return self.parentx
def union(self, x, y):
x = self.root(x)
y = self.root(y)
if x == y:
return
if self.rankx < self.ranky:
self.parentx = y
self.sizey += self.sizex
else:
self.parenty = x
self.sizex += self.sizey
if self.rankx == self.ranky:
self.rankx += 1
def same(self, x, y):
return self.root(x) == self.root(y)
uf1 = UnionFind(n + 1)
for p, q in pq:
uf1.union(p, q)
uf2 = UnionFind(n + 1)
for r, s in rs:
uf2.union(r, s)
res = []
# 各都市ごとに「根」を求めて、その根に付随する都市の個数を答える
# 都市 a,b が「道路のみ」でも「鉄道のみ」でも行き来できる
# -> uf1.root(a) == uf1.root(b) かつ uf2.root(a) == uf2.root(b)
for i in range(1, n + 1):
res.append((uf1.root(i), uf2.root(i)))
# print(res)
# (1, 1), (1, 2), (1, 2), (1, 4)
c = Counter(res)
# print(c)
# Counter({(1, 2): 2, (1, 1): 1, (1, 4): 1})
for r in res:
print(cr, end=" ")
テーマ
#UnionFind
蟻本 2-4 食物連鎖
メモ
https://atcoder.jp/contests/abc049/submissions/28347336
AtCoder ABC 049 D - 連結 (ARC 065 D) (青色, 400 点)
提出
code: python
n, k, l = map(int, input().split())
pq = list(map(int, input().split())) for _ in range(k)
rs = list(map(int, input().split())) for _ in range(l)
# print(pq)
# 1, 2], 2, 3, [3, 4
# print(rs)
# 2, 3
class UnionFind:
def __init__(self, n):
self.parent = i for i in range(n)
self.rank = 0 * n
self.size = 1 * n
def find(self, x):
if self.parentx == x:
return x
else:
self.parentx = self.find(self.parentx)
return self.parentx
def union(self, x, y):
x = self.find(x)
y = self.find(y)
if x == y:
return
if self.rankx < self.ranky:
self.parentx = y
self.sizey += self.sizex
else:
self.parenty = x
self.sizex += self.sizey
if self.rankx == self.ranky:
self.rankx += 1
def same(self, x, y):
return self.find(x) == self.find(y)
ufk = UnionFind(k)
for p, q in pq:
ufk.union(p, q)
ufl = UnionFind(l)
for r, s in rs:
ufl.union(r, s)
for i in range(n):
pass