結果
| 問題 |
No.2563 色ごとのグループ
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-12-02 16:02:50 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 388 ms / 2,000 ms |
| コード長 | 2,876 bytes |
| コンパイル時間 | 353 ms |
| コンパイル使用メモリ | 82,432 KB |
| 実行使用メモリ | 109,824 KB |
| 最終ジャッジ日時 | 2024-09-26 19:43:56 |
| 合計ジャッジ時間 | 7,008 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 35 |
ソースコード
class UnionFind:
def __init__(self, n: int) -> None:
"""
初期化
Parameters
----------
n:要素数
"""
self.par = [-1] * (n + 1)
self.rank = [0] * (n + 1)
def root(self, x: int) -> int:
"""
xの属するグループの親番号を返す
Parameters
----------
x:要素番号
Return
------
res:int
xの属するグループの親番号
"""
if self.par[x] == -1:
return x
else:
self.par[x] = self.root(self.par[x])
return self.par[x]
def issame(self, x, y) -> bool:
"""
xとyが同じグループに属するかどうかを返す
Parameters
----------
x,y:要素番号
Return
------
res:bool
true:xとyは同じグループである
false:xとyは同じグループでない
"""
return self.root(x) == self.root(y)
def unite(self, x, y) -> bool:
"""
xの属するグループとyの属するグループを併合する
Parameters
----------
x,y:要素番号
Return
------
res:bool
true:xとy、それぞれの属するグループを併合する
false:xとyはすでに同じグループのため、併合は行わない
"""
x = self.root(x)
y = self.root(y)
# 既に同じグループなら何もしない
if x == y:
return False
# unionbysize
if self.rank[x] < self.rank[y]:
self.par[x] = y
else:
self.par[y] = x
if self.rank[x] == self.rank[y]:
self.rank[x] += 1
return True
def rank(self, x) -> int:
"""
xの高さを返す
Return
------
res:int
xの属する根付き木の高さ
"""
return self.rank[x]
def groups(self) -> list:
"""
グループ構造の詳細を返す
Return
------
res:list[]
グループ構造を返す
"""
member = [[] for _ in range(len(self.par))]
for v in range(len(self.par)):
member[self.root(v)].append(v)
res = []
for mem in member:
if mem:
res.append(mem)
return res
from collections import defaultdict
N, M = map(int, input().split())
C = list(map(int, input().split()))
UF = UnionFind(N)
colors = defaultdict(int)
for _ in range(M):
u, v = map(int, input().split())
u -= 1
v -= 1
if C[u] == C[v]:
UF.unite(u, v)
for v in range(N):
if v == UF.root(v):
colors[C[v]] += 1
ans = sum([v - 1 for v in colors.values()])
print(ans)