已破防求调(玄2关
查看原帖
已破防求调(玄2关
1253423
Go_Forward楼主2024/9/6 20:29
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,k,head[maxn],d[maxn],id,ans,mx;
struct way{
	int from,pre,id,next;
}a[maxn];
struct find{
	int from,step;
}dis[maxn];
queue<int> f;
void add(int x,int y){
	a[++id].id=y;
	a[id].from=x;
	a[id].pre=1;
	a[id].next=head[x];
	head[x]=id;
}
int bfs(int x){
	memset(dis,0,sizeof(dis));
	f.push(x);
	dis[x].step=0;
	while(!f.empty()){
		int now=f.front();f.pop();
		for(int i=head[now];i;i=a[i].next){
			if(dis[a[i].id].step||a[i].id==x)
				continue;
			f.push(a[i].id);
			dis[a[i].id].step=dis[now].step+1;
			dis[a[i].id].from=i;
		}
	}
	int mxid=1;
	for(int i=2;i<=n;++i)
		if(dis[i].step>dis[mxid].step)
			mxid=i;
	return mxid;
}
void update(int now){
	if(now==0)
		return;
	//cout<<a[dis[now].from].from<<"->"<<a[dis[now].from].id<<'\n'; 
	a[dis[now].from].pre=-1;
	if(dis[now].from%2==1)
		a[dis[now].from+1].pre=-1;else
		a[dis[now].from-1].pre=-1;
	update(a[dis[now].from].from);
}
void dp(int x){
	d[x]=1;
	for(int i=head[x];i;i=a[i].next){
		if(d[a[i].id])
			continue;
		dp(a[i].id);
		mx=max(mx,d[x]+d[a[i].id]+a[i].pre);
		d[x]=max(d[x],d[a[i].id]+a[i].pre);
	}
}
int main(){
	cin>>n>>k;
	for(int i=1;i<n;++i){
		int x,y;
		cin>>x>>y;
		if(x>y)
			swap(x,y);
		add(x,y);
		add(y,x);
	}
	int x=bfs(1);
	int y=bfs(x);
	ans=n*2-1-dis[y].step;
	if(k==1){
		cout<<ans;
		return 0;
	}
	update(y);
	/*for(int i=1;i<=2*(n-1);++i)
		cout<<a[i].from<<' '<<a[i].id<<' '<<a[i].pre<<'\n';
	cout<<'\n';
	dp(1);
	for(int i=1;i<=n;++i)
		cout<<d[i]<<' ';
	cout<<'\n'; */
	cout<<ans-mx+1;
}
2024/9/6 20:29
加载中...