You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.4 KiB
C++
59 lines
1.4 KiB
C++
#include <cstdio>
|
|
#include <cstring>
|
|
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;
|
|
} |