module main; // https://kmjp.hatenablog.jp/entry/2015/09/04/0930 より import std; int N; int[][] G; int[] dist; // 部分木のうち最寄りの葉からの距離を求める int dfs1(int cur, int pre) { if (cur == 0 || G[cur].length > 1) { dist[cur] = N + 10; foreach_reverse (r; G[cur]) if (r != pre) dist[cur] = min(dist[cur], 1 + dfs1(r, cur)); } return dist[cur]; } // 親または最寄りの葉からの距離のうち短い方を求める void dfs2(int cur, int pre, int par) { dist[cur] = min(dist[cur], par); foreach_reverse (r; G[cur]) if (r != pre) dfs2(r, cur, dist[cur] + 1); } void main() { // 入力 N = readln.chomp.to!int; G = new int[][](N); foreach (_; 0 .. N - 1) { int x, y; readln.chomp.formattedRead("%d %d", x, y); x--, y--; G[x] ~= y; G[y] ~= x; } // 答えの計算 dist = new int[](N); dfs1(0, -1); dfs2(0, -1, 0); // 答えの出力 writefln("%(%d\n%)", dist); }