我人傻了:样例过了,还是错的!
查看原帖
我人傻了:样例过了,还是错的!
348644
kevin_max楼主2021/5/3 19:55
#include <bits/stdc++.h>
using namespace std;

const int ling=100010;
int ecnt,box[ling],shu;
int deep[ling],mdeep[ling],fa[ling];
int bashu[ling];
struct kevin{
    int v,next;
}tree[2*ling];

void edu(int v,int u){
    tree[++ecnt].v=v;
    tree[ecnt].next=box[u];
    box[u]=ecnt;
}

void dfs(int u,int f){
    if(shu==2){
        mdeep[u]=deep[u];
    }
    for(int i=box[u]; i; i=tree[i].next){
        int s=tree[i].v;
        if(s!=f){
            if(shu==1){
                fa[s]=u;
            }
            deep[s]=deep[u]+1;
            dfs(s,u);
            if(shu==2){
                mdeep[u]=max(mdeep[u],mdeep[s]);
            }
        }
    }
}

void ql(){
    memset(deep,0,sizeof(deep));
}

bool cmp(int a,int b){
    return a>b;
}

int main(){
    int n,k,u,v;
    scanf("%d%d",&n,&k);
    for(int i=1; i<=n-1; i++){
        scanf("%d%d",&u,&v);
        edu(u,v); edu(v,u);
    }
    dfs(1,0);
    int ans=1;
    for(int i=2; i<=n; i++){
        if(deep[ans]<deep[i]){
            ans=i;
        }
    }
    ql();
    shu++; //致敬郭沛骅
    dfs(ans,0);
    int zj=0; ans=1;
    for(int i=1; i<=n; i++){
        if(deep[ans]<deep[i]){
            ans=i;
            zj=deep[ans];
        }
    }
    int peihua=ans;
    for(int i=1; i<=(deep[ans]+1)/2; i++){
        peihua=deep[peihua];
    }
    ql();
    shu++;
    dfs(peihua,0);
    for(int i=1; i<=n; i++){
        bashu[i]=mdeep[i]-deep[i];
    }
    sort(bashu+1,bashu+1+n,cmp);
    int num=1;
    for(int i=k+1; i<=n; i++){
        num=max(num,bashu[i]+1);
    }
    printf("%d\n",num);
    return 0;
}
2021/5/3 19:55
加载中...