WA on #33
查看原帖
WA on #33
582123
Njaso楼主2024/10/13 22:59
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long

const int N=1e5+5;
int diam,dep[N],max_dep[N],p1,p2;
vector<int> adj[N],path;

void dfs1(int u,int par,int d,int& p){
    if(d>diam){
        diam=d;
        p=u;
    }
    for(int v:adj[u]){
        if(v==par)continue;
        dfs1(v,u,d+1,p);
    }
}

bool dfs2(int u,int par){
    if(u==p2){
        path.push_back(u);
        return 1;
    }
    for(int v:adj[u]){
        if(v==par)continue;
        if(dfs2(v,u)){
            path.push_back(u);
            return 1;
        }
    }
    return 0;
}

void dfs3(int u,int par){
    max_dep[u]=dep[u]=dep[par]+1;
    for(int v:adj[u]){
        if(v==par)continue;
        dfs3(v,u);
        max_dep[u]=max(max_dep[v],max_dep[u]);
    }
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n,k;
    cin>>n>>k;
    for(int i=1;i<n;i++){
        int u,v;
        cin>>u>>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }   
    if(n==k){
        cout<<"0\n";
        return 0;
    }
    dfs1(1,0,0,p1);
    diam=0;
    dfs1(p1,0,0,p2);
    dfs2(p1,0);
    int mid=path[(path.size()+1)/2];
    dfs3(mid,0);
    //贪心,每次选择剩余深度最深的分支
    priority_queue<tuple<int,int,int>> q;
    q.push({max_dep[mid],mid,0});
    int cnt=0;
    while(!q.empty()&&cnt<k){
        auto [d,u,par]=q.top();
        q.pop();
        cnt++;
        for(int v:adj[u]){
            if(v==par)continue;
            q.push({max_dep[v]-dep[v]+1,v,u});
        }
    }
    auto [d,u,par]=q.top();
    cout<<d<<'\n';
    return 0;
}
2024/10/13 22:59
加载中...