結果
問題 | No.2563 色ごとのグループ |
ユーザー |
![]() |
提出日時 | 2023-12-02 16:06:20 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,865 bytes |
コンパイル時間 | 268 ms |
コンパイル使用メモリ | 13,056 KB |
実行使用メモリ | 71,960 KB |
最終ジャッジ日時 | 2024-09-26 19:50:22 |
合計ジャッジ時間 | 14,937 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 30 TLE * 1 -- * 4 |
ソースコード
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)G = [ [] for _ in range(N+1) ]col = 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)G[u].append(v)G[v].append(u)ans = 0for key in col.keys():for i in col[key]:for j in col[key]:if not uf.issame(i,j):uf.unite(i,j)ans += 1print(ans)