結果

問題 No.827 総神童数
ユーザー koprickykopricky
提出日時 2019-04-11 07:38:15
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 1,738 bytes
コンパイル時間 633 ms
コンパイル使用メモリ 87,284 KB
実行使用メモリ 122,440 KB
最終ジャッジ日時 2023-09-25 01:30:17
合計ジャッジ時間 16,489 ms
ジャッジサーバーID
(参考情報)
judge14 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
testcase_01 WA -
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 AC 75 ms
71,360 KB
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
testcase_22 WA -
testcase_23 WA -
testcase_24 WA -
testcase_25 WA -
testcase_26 WA -
testcase_27 WA -
testcase_28 WA -
testcase_29 WA -
testcase_30 WA -
testcase_31 WA -
testcase_32 WA -
testcase_33 WA -
testcase_34 WA -
testcase_35 WA -
testcase_36 WA -
testcase_37 WA -
testcase_38 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys


class UnionFind:

    def __init__(self, node_size):
        self._node = node_size
        self.par = [i for i in range(self._node)]
        self.rank = [0] * self._node

    def find(self, ver):
        if self.par[ver] == ver:
            return ver
        else:
            self.par[ver] = self.find(self.par[ver])
            return self.par[ver]

    def unite(self, ver1, ver2):
        ver1, ver2 = self.find(ver1), self.find(ver2)
        if ver1 == ver2:
            return
        if self.rank[ver1] < self.rank[ver2]:
            ver1, ver2 = ver2, ver1
        self.par[ver2] = ver1
        if self.rank[ver1] == self.rank[ver2]:
            self.rank[ver1] += 1

    def same(self, ver1, ver2):
        return self.find(ver1) == self.find(ver2)


def dfs(u):
    head = 1
    stack[0], stack[1] = -1, u
    while head > 0:
        cur, prv, depth = stack[head], stack[head-1], head
        if visit[cur] == 0:
            ans[cur] = depth
        if visit[cur] == len(graph[cur]):
            head -= 1
            continue
        head += 1
        stack[head] = graph[cur][visit[cur]]
        visit[cur] += 1


if __name__ == '__main__':
    n = int(sys.stdin.readline())
    G, graph = [[] for _ in range(n)], [[] for _ in range(n)]
    ver, visit, stack, ans = [0]*n, [0]*n, [0]*(n+1), [0]*n
    for i in range(n-1):
        u, v = map(int, sys.stdin.readline().split())
        if u > v:
            u, v = v, u
        G[v-1].append(u-1)
        ver[i+1] = i+1
    uf = UnionFind(n)
    for i in range(n):
        for v in G[i]:
            graph[i].append(ver[uf.find(v)])
        for v in G[i]:
            uf.unite(i, v)
        ver[uf.find(i)] = i
    dfs(n-1)
    for val in ans:
        print(val)
0