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++14 (judge verdict: Accepted)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cmath>
#include <iomanip>
#include <cassert>
#include <bitset>
using namespace std;

typedef pair<int, int> P;
#define rep(i, n) for (int i=0; i<(n); i++)
#define all(c) (c).begin(), (c).end()
#define uniq(c) c.erase(unique(all(c)), (c).end())
#define _1 first
#define _2 second
#define pb push_back
#define INF 1145141919
#define MOD 1000000007

int N;
vector<int> G[100000];
int DD[100000];
int D1[100000], D2[100000], Ds[100000];

int dfs1(int x, int p) {
  int s = 0;
  for (int t : G[x]) {
    if (t == p) continue;
    s = max(s, dfs1(t, x)+1);
  }
  return DD[x] = s;
}
int dfs2(int x, int p) {
  int s = 0;
  vector<P> vs;
  for (int t : G[x]) {
    if (t == p) continue;
    vs.pb(P(DD[t]+1, t));
  }
  if (p != -1) {
    int m = 0;
    if (Ds[p] == x) m = D2[p];
    else m = D1[p];
    vs.pb(P(m+1, p));
  }
  assert(!vs.empty());
  sort(all(vs), greater<P>());
  D1[x] = vs[0]._1;
  Ds[x] = vs[0]._2;
  if (vs.size() > 1) D2[x] = vs[1]._1;
  for (int t : G[x]) {
    if (t == p) continue;
    dfs2(t, x);
  }
  return D1[x];
}

signed main() {
  ios::sync_with_stdio(false); cin.tie(0);
  cin >> N;
  rep(i, N-1) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    G[u].pb(v);
    G[v].pb(u);
  }
  dfs1(0, -1);
  dfs2(0, -1);
  rep(i, N) cout << 2*(N-1) - D1[i] << "\n";
  return 0;
}