比赛 2025.12.13 评测结果 AAAAAWWAAAAAAAAAAAAAAAAAAAAAAA
题目名称 巡逻 最终得分 93
用户昵称 汐汐很希希 运行时间 2.769 s
代码语言 C++ 内存使用 97.57 MiB
提交时间 2025-12-13 09:42:06
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e6+10;
const int M=0;
const int MOD=998244353;
const int MAXX=2e9;
int n,k,ans=-MAXX,L;
vector<int> g[N];
vector<int> e[N];
int d[N],vis[N],v[N],de[N],leaf=1;
void add(int x,int y,int w){
	g[x].push_back(y);
	e[x].push_back(w);
}
void dfs(int x,int f,int w,int t){
	d[x]=d[f]+w;
	if(t==2) vis[x]=f;
	for(int i=0;i<g[x].size();i++){
		int y=g[x][i],w=e[x][i];
		if(y==f) continue;
		dfs(y,x,w,t);
	}
	if(d[x]>d[leaf]) leaf=x;
	return;
}
void dp(int x,int f){
	for(int i=0;i<g[x].size();i++){
		int y=g[x][i];
		if(y==f) continue;
		if(v[x]&&v[y]) e[x][i]=-1;
		int w=e[x][i];
		dp(y,x);
		ans=max(ans,de[x]+de[y]+w);
		de[x]=max(de[x],de[y]+w);
	}
	return; 
}
int main()
{
	freopen("xunluo.in","r",stdin);
	freopen("xunluo.out","w",stdout);
	
	cin>>n>>k; 
	for(int i=1;i<n;i++){
		int a,b;
		cin>>a>>b;
		add(a,b,1),add(b,a,1);
	}
	dfs(1,0,0,1);dfs(leaf,0,0,2);
	L=d[leaf];
	if(k==1){
		printf("%d",2*(n-1)-L+1);
		return 0;
	}
	for(int i=leaf;i;i=vis[i]) v[i]=1; 
	dp(1,0);
	cout<<n*2-L-ans<<'\n';
	return 0;
}