func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, head[100005], tot, d[100005], fa[100005], vis[100005], lf[100005], cnt;   struct node {     int v, nxt;   } edg[100005 << 1];   inline void addedg(int u, int v) {     edg[tot].v = v;     edg[tot].nxt = head[u];     head[u] = tot++;   }   inline void init() {     memset(head, -1, sizeof(int) * (n + 1));     tot = cnt = 0;   }   inline void dfs1(int u, int f) {     int v;     d[u] = 0;     for (int i = head[u]; i != -1; i = edg[i].nxt) {       v = edg[i].v;       ++d[u];       if (v == f) continue;       dfs1(v, u);     }   }   inline void dfs2(int u, int f, int dis) {     int v;     fa[u] = f;     d[u] = dis;     for (int i = head[u]; i != -1; i = edg[i].nxt) {       v = edg[i].v;       if (f == v) continue;       dfs2(v, u, dis + 1);     }   }   inline bool cmp(int u, int v) { return d[u] > d[v]; }   set<int> se;   int main() {     scanf( %d , &n);     init();     int u, v;     for (int i = 1; i < n; ++i) {       scanf( %d%d , &u, &v);       addedg(u, v);       addedg(v, u);     }     dfs1(1, 1);     for (int i = 1; i <= n; ++i) {       if (d[i] == 1) lf[cnt++] = i;     }     int root = lf[0];     dfs2(root, root, 0);     vis[root] = 1;     int maxn = 0, minn = 1;     for (int i = 1; i < cnt; ++i) {       if (d[lf[i]] & 1) minn = 3;     }     fa[root] = edg[head[root]].v;     maxn = n - 1 - cnt;     for (int i = 0; i < cnt; ++i) se.insert(fa[lf[i]]);     maxn += se.size();     printf( %d %d n , minn, maxn);     return 0;   }   