#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define FOR(i,a,b) for (int i=(a);i<(b);i++) #define RFOR(i,a,b) for (int i=(b)-1;i>=(a);i--) #define REP(i,n) for (int i=0;i<(n);i++) #define RREP(i,n) for (int i=(n)-1;i>=0;i--) #define ALL(a) (a).begin(),(a).end() using namespace std; typedef long long ll; int N; const int MAX_N = 500010; vector G[MAX_N]; queue q; int depth_0[MAX_N]; int depth_1[MAX_N]; bool leaves[MAX_N]; bool visited[MAX_N]; void bfs_0() { depth_0[1] = 0; visited[1] = true; q.push(1); while (!q.empty()) { int v = q.front(); q.pop(); bool is_leaf = true; for (int u : G[v]) { if (visited[u]) continue; is_leaf = false; visited[u] = true; depth_0[u] = depth_0[v] + 1; q.push(u); } leaves[v] = is_leaf; } } void bfs_1(int s) { memset(visited, 0, sizeof(visited)); depth_1[s] = 0; visited[s] = true; q.push(s); while (!q.empty()) { int v = q.front(); q.pop(); if (depth_1[v] >= depth_0[v]) continue; depth_0[v] = depth_1[v]; for (int u : G[v]) { if (visited[u]) continue; visited[u] = true; depth_1[u] = depth_1[v] + 1; q.push(u); } } } int main(int argc, char *argv[]) { cin.tie(0); ios::sync_with_stdio(false); cin >> N; REP(i,N-1) { int x, y; cin >> x >> y; G[x].push_back(y); G[y].push_back(x); } bfs_0(); REP(i,MAX_N) if (leaves[i]) bfs_1(i); REP(i,N) cout << depth_0[i+1] << '\n'; cout << flush; return 0; }