求助!!!为什么不对
查看原帖
求助!!!为什么不对
445896
I_m_FW楼主2021/11/10 23:41
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int h[N],to[N],ne[N],tot,ans;
int n,k,pr[N],root,sy,d[N],s[N],dip,sum[N];
bool st[N];
vector<int> v;
void add(int x,int y){
	to[++tot]=y;ne[tot]=h[x];h[x]=tot;
}
void bfs(){
	queue<int> q;q.push(1);st[1]=true;
	while(q.size()){
		int u=q.front();q.pop();
		root=u;
		for(int i=h[u];i;i=ne[i]){
			int y=to[i];
			if(st[y])continue;st[y]=true;
			q.push(y);
		}
	}
}
void bfs2(){
	memset(st,false,sizeof st);
	memset(pr,-1,sizeof pr);
	queue<int> q;q.push(root);st[root]=true;
	while(q.size()){
		int u=q.front();q.pop();
		sy=u;
		for(int i=h[u];i;i=ne[i]){
			int y=to[i];
			if(st[y])continue;st[y]=true;
			q.push(y);pr[y]=u;
		}
	}
	int t=sy;v.push_back(sy);
	while(pr[t]!=-1){
		v.push_back(pr[t]);
		t=pr[t];
	}
}
void bfs3(){
	memset(d,0x3f,sizeof d);
	queue<int> q;q.push(root);d[root]=1;d[0]=0;dip=1;
	s[1]=1;
	while(q.size()){
		int u=q.front();q.pop();
		for(int i=h[u];i;i=ne[i]){
			int y=to[i];
			if(d[y]>d[u]+1){
				d[y]=d[u]+1;
				s[d[y]]++;
				dip=max(dip,d[y]);
				q.push(y);
			}
			
		}
	}
}
int main(){
	cin>>n>>k;
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);add(y,x);
	}
	bfs();
	bfs2();
	root=v[(v.size()-1)>>1];
	bfs3();
	for(int i=1;i<=dip;i++)sum[i]=sum[i-1]+s[i];
	for(int i=1;i<=dip;i++){
		if(sum[i]>k){
			ans=dip-i+1;break;
		}
	}
	cout<<ans;
}
2021/11/10 23:41
加载中...