一开始没看到要保证最后是树……所以一定要从叶子开始删
枚举重心,如果k是偶数,那么按当前重心提起来deep大于k/2的全都要切掉,这样枚举重心然后取min即可 奇数的话就是枚举直径中间的边,然后从两边的点分别dfs删点#include#include using namespace std;const int N=5005;int n,k,m,h[N],cnt,ans=1e9,sm;struct qwe{ int ne,no,to;}e[N];int read(){ int r=0,f=1; char p=getchar(); while(p>'9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f;}void add(int u,int v){ cnt++; e[cnt].ne=h[u]; e[cnt].no=u; e[cnt].to=v; h[u]=cnt;}void dfs(int u,int fa,int de){ if(de>m) sm++; for(int i=h[u];i;i=e[i].ne) if(e[i].to!=fa) dfs(e[i].to,u,de+1);}int main(){ n=read(),k=read(),m=k/2; for(int i=1;i