比赛 2025.12.13 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 巡逻 最终得分 100
用户昵称 梦那边的美好ME 运行时间 0.485 s
代码语言 C++ 内存使用 5.97 MiB
提交时间 2025-12-13 11:06:38
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long

ll n,k,cnt,ye=1,ye1=1,l1,l2; 
ll head[110000],nxt[210000],to[210000],w[210000];
ll fa[110000],dis[110000];
ll v[110000],d[110000];

void add(ll x,ll y,ll z){
	to[++cnt]=y;
    w[cnt]=z;
	nxt[cnt]=head[x];
	head[x]=cnt;
}

void dfs(ll x,ll pre,ll z,ll t){
	dis[x]=dis[pre]+z;
	if(t==2) fa[x]=pre; 
	for(int i=head[x];i;i=nxt[i]){
		ll y=to[i],z=w[i];
		if(y==pre) continue;
		dfs(y,x,z,t);
	}
	if(dis[x]>dis[ye]) ye=x;
}

void dfs2(ll x,ll pre){
	for(int i=head[x];i;i=nxt[i]){
		ll y=to[i];
		if(y==pre) continue;
		if(v[x]&&v[y]) w[i]=-1;
		dfs2(y,x);
		l2=max(l2,d[x]+d[y]+w[i]);
		d[x]=max(d[x],d[y]+w[i]);
	} 
}

int main(){
    freopen("xunluo.in","r",stdin);
    freopen("xunluo.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>k;
	for(int i=1;i<n;i++){
		ll x,y;
        cin>>x>>y;
		add(x,y,1),add(y,x,1);
	}
	dfs(1,0,0,1);
	dfs(ye,0,0,2);
	l1=dis[ye];
	if(k==1){
		printf("%d",2*(n-1)-l1+1);
		return 0;
	}
	for(int i=ye;i;i=fa[i]) v[i]=1;
	dfs2(1,0);
	cout<<n*2-l1-l2;
	return 0;
}