結果
問題 | No.2563 色ごとのグループ |
ユーザー |
![]() |
提出日時 | 2023-12-02 16:24:54 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,224 bytes |
コンパイル時間 | 274 ms |
コンパイル使用メモリ | 12,672 KB |
実行使用メモリ | 65,056 KB |
最終ジャッジ日時 | 2024-09-26 20:16:37 |
合計ジャッジ時間 | 17,027 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 12 WA * 20 RE * 3 |
ソースコード
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 = dd(list)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)col_root[C[u]] = [uf.root(u),u]ans = 0#print(col_root)for key in col.keys():n = len(col[key])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)