from collections import defaultdict class UnionFind: def __init__(self,N,label=None,f=None,weighted=False,rollback=False): self.N=N self.parents=[None]*self.N self.size=[1]*self.N self.roots={i for i in range(self.N)} self.label=label if self.label!=None: self.label=[x for x in label] self.f=f self.weighted=weighted if self.weighted: self.weight=[0]*self.N self.rollback=rollback if self.rollback: self.operate_list=[] self.operate_set=[] def Find(self,x): stack=[] while self.parents[x]!=None: stack.append(x) x=self.parents[x] if not self.rollback: if self.weighted: w=0 for y in stack[::-1]: self.parents[y]=x w+=self.weight[y] self.weight[y]=w else: for y in stack[::-1]: self.parents[y]=x return x def Union(self,x,y,w=None): root_x=self.Find(x) root_y=self.Find(y) if self.rollback: self.operate_list.append([]) self.operate_set.append([]) if root_x==root_y: if self.weighted: if self.weight[y]-self.weight[x]==w: return True else: return False else: if self.size[root_x]=D*D or not XY[(i+di)*D+(j+dj)]: continue for x,y,n in XY[i*D+j]: for xx,yy,nn in XY[(i+di)*D+(j+dj)]: if (x-xx)**2+(y-yy)**2<=100: UF.Union(n,nn) ans=1 for lst in UF.Linked_Components().values(): le=len(lst) ans=max(ans,2) for a in range(le): i=lst[a] for b in range(a+1,le): j=lst[b] ans=max(ans,((X[i]-X[j])**2+(Y[i]-Y[j])**2)**.5+2) print(ans)