| 比赛 |
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;
}