Problem:
Problem I: Traffic Tree

Problem

それぞれ1からNまでの番号が付いたN個の頂点が、N-1本の無向辺によって繋がれたグラフが与えられる。各頂点について、その頂点からスタートしてすべての頂点を訪れるための最短のステップ数を出力せよ。

ただし、ある頂点から1本の辺をたどって別の頂点に移動することを1ステップとする。

Input

入力は以下の形式で与えられる。

N
u1 v1
.
.
.
uN−1 vN−1

1行目に、1つの整数Nが与えられる。

続くN-1行のうちi行目にはi番目の辺の両端の頂点番号を表す整数ui, viが空白区切りで与えられる。

Constraints

2 ≤ N ≤ 105

1 ≤ ui,vi ≤ N (1 ≤ i ≤ N-1)

ui ≠ vi

与えられるグラフは連結である

Output

頂点1から頂点Nについてi行目に頂点iからスタートしてすべての頂点を訪れるための最短のステップ数を出力せよ。

Sample Input 1

2
1 2

Sample Output 1

1
1

Sample Input 2

6
1 2
1 3
3 4
3 5
5 6

Sample Output 2

7
6
8
7
7
6

Sample Input2の図

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
class MainClass
{
    static void Main(string[] args)
    {
        var n = int.Parse(System.Console.ReadLine().Trim());
        var nodes = new List<List<int>>(n);
        foreach (var i in Enumerable.Range(0, n)) nodes.Add(new List<int>());
        foreach(var i in Enumerable.Range(0, n - 1))
        {
            var edge = System.Console.ReadLine().Trim().Split(' ').Select(s => int.Parse(s) - 1).ToArray();
            nodes[edge[0]].Add(edge[1]);
            nodes[edge[1]].Add(edge[0]);
        }
        var distanceFromZero = DistanceFrom(0, nodes);
        var maxA = Enumerable.Range(0, n).OrderByDescending(i => distanceFromZero[i]).First();
        var distanceFromEndA = DistanceFrom(maxA, nodes);
        var maxB = Enumerable.Range(0, n).OrderByDescending(i => distanceFromEndA[i]).First();
        var distanceFromEndB = DistanceFrom(maxB, nodes);
        foreach(var i in Enumerable.Range(0, n))
        {
            Console.WriteLine(2 * n - 2 - Math.Max(distanceFromEndA[i], distanceFromEndB[i]));
        }
    }
    static int[] DistanceFrom(int from, List<List<int>> nodes)
    {
        var distance = Enumerable.Repeat(-1, nodes.Count).ToArray(); distance[from] = 0;
        var queue = new Queue<int>(); queue.Enqueue(from);
        while(queue.Count > 0)
        {
            var current = queue.Dequeue();
            foreach(var next in nodes[current])
            {
                if (distance[next] == -1)
                {
                    distance[next] = distance[current] + 1;
                    queue.Enqueue(next);
                }
            }
        }
        return distance;
    }
}