結果
| 問題 | 
                            No.94 圏外です。(EASY)
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2015-07-19 19:12:42 | 
| 言語 | Python3  (3.13.1 + numpy 2.2.1 + scipy 1.14.1)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 294 ms / 5,000 ms | 
| コード長 | 1,804 bytes | 
| コンパイル時間 | 84 ms | 
| コンパイル使用メモリ | 12,928 KB | 
| 実行使用メモリ | 11,264 KB | 
| 最終ジャッジ日時 | 2024-06-26 07:38:00 | 
| 合計ジャッジ時間 | 3,457 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge3 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 22 | 
ソースコード
import math
import itertools
import collections
class DisjointSet(object):
    def __init__(self, n):
        self.parent = list(range(n))
        self.rank = [0] * n
        self.num = n  # number of disjoint sets
    def union(self, x, y):
        self._link(self.find_set(x), self.find_set(y))
    def _link(self, x, y):
        if x == y:
            return
        self.num -= 1
        if self.rank[x] > self.rank[y]:
            self.parent[y] = x
        else:
            self.parent[x] = y
            if self.rank[x] == self.rank[y]:
                self.rank[y] += 1
    def find_set(self, x):
        xp = self.parent[x]
        if xp != x:
            self.parent[x] = self.find_set(xp)
        return self.parent[x]
def read_data():
    N = int(input())
    xy = []
    for n in range(N):
        x, y = map(int, input().split())
        xy.append((x, y))
    return N, xy
def solve(N, xy):
    if N == 0:
        return 1
    if N == 1:
        return 2
    djs = DisjointSet(N)
    for i in range(N-1):
        xi, yi = xy[i]
        for j in range(i+1, N):
            xj, yj = xy[j]
            if (xi-xj)**2 + (yi-yj)**2 <= 100:
                djs.union(i, j)
    n_groups = djs.num
    if n_groups == N:
        return 2
    groups = collections.defaultdict(list)
    for i in range(N):
        groups[djs.find_set(i)].append(i)
    max_dist = -1
    for group in groups.values():
        if len(group) == 1:
            dist = 1
            if dist > max_dist:
                max_dist = dist
        for i, j in itertools.combinations(group, 2):
            xi, yi = xy[i]
            xj, yj = xy[j]
            dist = math.hypot(xi-xj, yi-yj)
            if dist > max_dist:
                max_dist = dist
    return max_dist + 2
N, xy = read_data()
print(solve(N, xy))