24pts求调(玄关)
查看原帖
24pts求调(玄关)
1144893
Kenneth1楼主2025/2/5 23:32
#include <bits/stdc++.h>
using namespace std;
int n,k; 
int dis[100001],f[100001],way[100001],diss[100001];
map <int,bool> mp;
struct node{
	int end,len;
};
vector <node> ed[100001];
int s=0,sx=0,sxx=0;
void dfs(int x){
	for(int i=0;i<ed[x].size();i++){
		if(f[ed[x][i].end]==0){
			f[ed[x][i].end]=1;
			dis[ed[x][i].end]=dis[x]+1;
			dfs(ed[x][i].end);
		}
	}
}
void dfs1(int x,int now){
	for(int i=0;i<ed[x].size();i++){
		if(f[ed[x][i].end]==0){
			f[ed[x][i].end]=x;
			dis[ed[x][i].end]=dis[x]+1;
			way[now]=ed[x][i].end;
			dfs1(ed[x][i].end,now+1);
		}
	}
}
int dpmx;
void trdp(int x,int fa){
	for(int i=0;i<ed[x].size();i++){
		if(fa==ed[x][i].end){
			continue;
		}
		trdp(ed[x][i].end,x);
		dpmx=max(dpmx,ed[x][i].len+diss[x]+diss[ed[x][i].end]);
		diss[x]=max(diss[x],diss[ed[x][i].end]+ed[x][i].len);
	}
}
void again(){
	for(int i=0;;i++){
		mp[way[i]]=1;
		if(way[i]==sxx){
			break;
		}
	}
    for(int i=1;i<=n;++i)
        if(mp.count(i)==1)
            for(int j=0;j<ed[i].size();j++)
                if(mp.count(ed[i][j].end)==1)
                    ed[i][j].len=-1;
	trdp(1,0);
}
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	cin>>n>>k;
	int x,y;
	for(int i=1;i<n;i++){
		cin>>x>>y;
		ed[x].push_back({y,1});
		ed[y].push_back({x,1});
	}
	f[1]=-1;
	dfs(1);
	for(int i=1;i<=n;i++){
		if(dis[i]>s){
			s=dis[i];
			sx=i;
		}
	}
	memset(dis,0,sizeof(dis));
	memset(f,0,sizeof(f));
	f[sx]=-1;
	way[0]=sx;
	dfs1(sx,1);
	s=0;
	for(int i=1;i<=n;i++){
		if(dis[i]>s){
			s=dis[i];
			sxx=i;
		}
	}
	if(k==2){
		again();
//		cout<<s<<endl<<dpmx<<endl;
		cout<<2*n-s-dpmx;
		return 0;
	}
	cout<<n*2-s-1;
}
2025/2/5 23:32
加载中...