結果
問題 | No.2563 色ごとのグループ |
ユーザー |
![]() |
提出日時 | 2023-12-02 16:49:32 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 1,817 ms / 2,000 ms |
コード長 | 2,617 bytes |
コンパイル時間 | 94 ms |
コンパイル使用メモリ | 12,544 KB |
実行使用メモリ | 91,540 KB |
最終ジャッジ日時 | 2024-09-26 20:47:41 |
合計ジャッジ時間 | 21,995 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 35 |
ソースコード
from collections import defaultdict as ddclass UnionFind():#初期化def __init__(self, n):self.par = [-1] * nself.rank = [0] * nself.siz = [1] * n#根を求めるdef root(self, x):if self.par[x] == -1:return x#xが根の場合はxを返すelse:self.par[x] = self.root(self.par[x]) #経路圧縮return self.par[x]#xとyが同じグループに属するか(根が一致するか)def issame(self, x, y):return self.root(x) == self.root(y)#xを含むグループとyを含むグループを併合するdef unite(self, x, y):#x側とy側の根を取得するrx = self.root(x)ry = self.root(y)if rx == ry:return False #すでに同じグループの時は何もしない#union by rankif self.rank[rx] < self.rank[ry]: #ry側のrankが小さくなるようにするrx, ry = ry, rxself.par[ry] = rx #ryをrxの子とするif self.rank[rx] == self.rank[ry]:#ry側のrankを調整するself.rank[rx] += 1self.rank[rx] += self.siz[ry] #rx側のsizを調整するreturn True#xを含む根付き木のサイズを求めるdef size(self, x):return self.siz[self.root(x)]N,M = map(int, input().split())C = list(map(int, input().split()))uf = UnionFind(N+1)col = dd(list)col_root_set = dd(set)for i in range(N):col[C[i]].append(i+1)for _ in range(M):u,v = map(int,input().split())if C[u-1] != C[v-1]:continueuf.unite(u,v)#print("#",uf.root(u),uf.root(v))#col_root_set[C[u-1]].add(uf.root(u))#col_root_set[C[v-1]].add(uf.root(v))"""if not col_root[C[u]]:col_root[C[u]] = [uf.root(u),u]if uf.size(u) > uf.size(col_root[C[u]][0]):col_root[C[u]] = [uf.root(u),u]"""ans = 0#print(col_root)for i in range(1, N+1):col_root_set[C[i-1]].add(uf.root(i))#print(col_root_set)for key in col.keys():#print(col_root_set[key])ans += max(len(col_root_set[key])-1,0)"""if col_root[key]:c,u = col_root[key][0],col_root[key][1]else:c,u = col[key][0],col[key][0]for i in range(n):if c != uf.root(col[key][i]):uf.unite(u,col[key][i])ans += 1""""""for i in range(n):for j in range(i, n):if i == j:continueif not uf.issame(col[key][i],col[key][j]):uf.unite(col[key][i],col[key][j])ans += 1"""print(ans)