【题目链接】http://www.lydsy.com/JudgeOnline/problem.php?id=1912
【呆马】
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<iostream>
const int N=1e5+1;
using namespace std;
struct st{int to,next,v;} e[N<<1];
int n,k,x,y,i,p,ans,cnt,fi[N],f[N][2],g[N][2];
void add(int x,int y)
{
e[++cnt].to=y; e[cnt].next=fi[x]; e[cnt].v=1; fi[x]=cnt;
e[++cnt].to=x; e[cnt].next=fi[y]; e[cnt].v=1; fi[y]=cnt;
}
void dp(int x,int fa)
{
f[x][0]=f[x][1]=0;
g[x][0]=g[x][1]=x;
for (int y,i=fi[x];i;i=e[i].next)
if (e[i].to!=fa)
{
dp(y=e[i].to,x);
int z=e[i].v;
if (f[y][0]+z>f[x][0]) f[x][1]=f[x][0],f[x][0]=f[y][0]+z,g[x][1]=g[x][0],g[x][0]=g[y][0];
else if (f[y][0]+z>f[x][1]) f[x][1]=f[y][0]+z,g[x][1]=g[y][0];
}
if (f[x][0]+f[x][1]>f[p][0]+f[p][1]) p=x;
}
bool go(int x,int fa)
{
bool bo=0;
if (x==g[p][0] || x==g[p][1]) return 1;
for (int i=fi[x];i;i=e[i].next)
if (e[i].to!=fa && go(e[i].to,x)) e[i].v=-1,bo=1;
return bo;
}
int main()
{
scanf("%d%d\n",&n,&k);
for (i=1;i<n;i++)
{
scanf("%d%d\n",&x,&y);
add(x,y);
}
dp(1,0);
ans=((n-1)<<1)-f[p][0]-f[p][1]+1;
if (k==2)
{
go(p,0);
p=0;
dp(1,0);
ans=ans-f[p][0]-f[p][1]+1;
}
printf("%d",ans);
}