dalao求调
查看原帖
dalao求调
509310
LiAuPb楼主2023/4/9 20:58
#include<bits/stdc++.h>
using namespace std;
int n, k, tot, u, v, x = 1, y, len, ans, h[200010], dep[200010], f[200010], maxd[200010], lend[200010];
struct Edge{
    int u;
	int v;
	int w;
	int ne;
}a[200010];
void add(int u, int v, int w){
    a[++tot].u = u;
	a[tot].v = v;
	a[tot].w = w;
    a[tot].ne = h[u];
	h[u] = tot;
}
void dfs(int x, int fa){
    if(len < dep[x]){
    	len = dep[x];
		y = u;
	}
    for(int i = h[x]; i >= 1; i = a[i].ne){
        int v = a[i].v;
        if(fa != v){
            dep[v] = dep[x] + 1;
            f[v] = x;
            dfs(v, x);
        }
    }
}
void dfs2(int x, int fa){
    maxd[x] = dep[x];
    for(int i = h[x]; i; i = a[i].ne){
        int v = a[i].v;
        if(fa != v){
            dep[v] = dep[x] + 1;
            f[v] = x;
            dfs2(v, x);
            maxd[x] = max(maxd[x], maxd[v]);
        }
    }
}
bool cmp(int a, int b){
	return a > b;
}
int main(){
    scanf("%d%d", &n, &k);
    for(int i = 1; i < n; i++){
        scanf("%d%d", &u, &v);
        add(u, v, 1);
        add(v, u, 1);
    }
    dfs(x, -1);
    memset(f, 0, sizeof(f));
    memset(dep, 0, sizeof(dep));
    len = 0;
    dfs(y, -1);
    int pos = y;
    for(int i = 1; i <= (dep[y] + 1) / 2; i++, pos = f[pos]);
    memset(f, 0, sizeof(f));
    memset(dep, 0, sizeof(dep));
    x = 1;
	y = len = 0;
    dfs2(pos, -1);
    for(int i = 1; i <= n; i++){
    	lend[i] = maxd[i] - dep[i];
	}
    sort(lend + 1, lend + n + 1, cmp);
    for(int i = k + 1; i <= n; i++){
    	ans = max(ans, lend[i] + 1);
	}
    printf("%d", ans);
    return 0;
}
2023/4/9 20:58
加载中...