85pts求助
查看原帖
85pts求助
494601
gcx12012楼主2023/5/31 10:08
#include<bits/stdc++.h>
#include<cmath>
#define ll long long
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Rof(i,a,b) for(int i=a;i>=b;i--)
#define N 100010
#define pb push_back
#define ls x<<1
#define rs x<<1|1
#define lson ls,l,mid
#define rson rs,mid+1,r
#define SP fixed<<setprecision(15)

using namespace std;
struct node{
    int v,w;
};
vector<node>e[N];
int n,k,zj1=0,zj2=0;

ll read(){
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int dep[N],f[N],bj[N];
int mx=0,mx2=0;
void dfs1(int u,int fa){
    dep[u]=dep[fa]+1;
    f[u]=fa;
    if(dep[u]>dep[mx]) mx=u;
    for(int i=0;i<e[u].size();i++){
        int v=e[u][i].v;
        if(v==fa) continue;
        dfs1(v,u);
    }
}
void dfs2(int u,int fa){
    dep[u]=dep[fa]+1;
    if(dep[u]>dep[mx2]) mx2=u;
    for(int i=0;i<e[u].size();i++){
        int v=e[u][i].v;
        if(v==fa) continue;
        dfs2(v,u);
    }
}
void dfs3(int u,int fa){
    for(int i=0;i<e[u].size();i++){
        int v=e[u][i].v;
        if(bj[v]) e[u][i].w=-1;
        if(v==fa) continue;
        dfs3(v,u);
    }
}
int now[N];
void dfs4(int u,int fa){
    int m1=0,m2=0;
    for(int i=0;i<e[u].size();i++){
        int v=e[u][i].v;
        if(v==fa) continue;
        dfs4(v,u);
        if(e[u][i].w+now[v]>m1) m2=m1,m1=e[u][i].w+now[v];
        else if(e[u][i].w+now[v]>m2) m2=e[u][i].w+now[v];
    }
    now[u]=m1;
    zj2=max(zj2,m1+m2);
}

int main()
{
    //freopen("patrol.in","r",stdin);
    //freopen("patrol.out","w",stdout);
    n=read(),k=read();
    For(i,1,n-1){
        int u=read(),v=read();
        e[u].pb({v,1});
        e[v].pb({u,1});
    }
    dfs1(1,0);
    dfs2(mx,0);
    zj1=dep[mx2]-1;
    if(k==1){
        cout<<(n-1)*2-zj1+1<<endl;
        return 0;
    }
    while(mx){
        bj[mx]=1;
        mx=f[mx];
    }
    while(mx2){
        bj[mx2]=1;
        mx2=f[mx2];
    }
    dfs3(1,0);
    dfs4(1,0);
    cout<<n*2-zj1-zj2<<endl;
    return 0;
}


rt

2023/5/31 10:08
加载中...