#include #include int n, k, head[100010], next[100010 << 1], from[100010 << 1], to[100010 << 1], len[100010 << 1], maxlen, ecnt, fa[100010], mx1[100010], mx2[100010], en; void addEdge(int f, int t) { next[ecnt] = head[f]; head[f] = ecnt; to[ecnt] = t; from[ecnt] = f; len[ecnt] = 1; ecnt++; } int dfs(int u, int fa) { int max1 = 0, max2 = 0; for (int i = head[u]; ~i; i = next[i]) if (to[i] != fa) { int tmp = len[i] + dfs(to[i], u); if (tmp > max1) { max2 = max1; max1 = tmp; mx2[u] = mx1[u]; mx1[u] = i; } else if (tmp > max2) { max2 = tmp; mx2[u] = i; } } if (maxlen < max1 + max2) maxlen = max1 + max2, en = u; return max1; } int main() { memset(head, -1, sizeof(head)); scanf("%d%d", &n, &k); for (int i = 1, x, y; i < n; i++) { scanf("%d%d", &x, &y); addEdge(x, y); addEdge(y, x); } dfs(1, 0); int ans = ((n - 1) << 1) - (maxlen - 1); if (k == 2) { for (int i = mx1[en]; i; i = mx1[to[i]]) len[i] = len[i ^ 1] = -1; for (int i = mx2[en]; i; i = mx1[to[i]]) len[i] = len[i ^ 1] = -1; maxlen = 0; dfs(1, 0); ans -= maxlen - 1; } printf("%d", ans); return 0; }