比赛 2025.12.13 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 巡逻 最终得分 100
用户昵称 李奇文 运行时间 0.471 s
代码语言 C++ 内存使用 4.90 MiB
提交时间 2025-12-13 12:20:22
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+5;
int n,k,tot=0,e1=1,e2=1,l1,l2;
int hd[N],nxt[N],to[N],w[N];
int fa[N],d[N];
int v[N],f[N];
void add(int x,int y,int z) {
    to[++tot]=y;
    nxt[tot]=hd[x];
    w[tot]=z;
    hd[x]=tot;
}
void dfs1(int u,int p,int z,int tp) {
    d[u]=d[p]+z;
    if(tp==2) fa[u]=p;
    for(int i=hd[u];i;i=nxt[i]){
        int y=to[i],zw=w[i];
        if(y!=p) dfs1(y,u,zw,tp);
    }
    if(d[u]>d[e1]) e1=u;
}
void dfs2(int u,int p) {
    for(int i=hd[u];i;i=nxt[i]){
        int y=to[i];
        if(y!=p){
        	if(v[u]&&v[y]) w[i]=-1;
        	dfs2(y,u);
        	l2=max(l2,f[u]+f[y]+w[i]);
        	f[u]=max(f[u],f[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){
        int x,y;
        cin>>x>>y;
        add(x,y,1);
        add(y,x,1);
    }
    dfs1(1,0,0,1);
    dfs1(e1,0,0,2);
    l1=d[e1];
    if(k==1){
        cout<<2*(n-1)-l1+1<<"\n";
    }else {
    	for(int i(e1);i;i=fa[i]) v[i]=1;
    	dfs2(1,0);
   	 	cout<<n*2-l1-l2<<"\n";
    }
    return 0;
}