88分求调
查看原帖
88分求调
1189340
aishiteru_mitsu_ha楼主2025/1/18 17:04

记录

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll>edge[114514];
ll n,k,dp1[100006],dp2[100006],ans,cnt,s,t,fa[100006];
bool used[100006];
void dfs(ll num,ll pre,ll* r,ll sum);
void dp(ll num,ll pre);
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
	cin>>n>>k;
	ans=(n-1)*2;
	for(int i=1;i<n;i++){
		ll a,b;
		cin>>a>>b;
		used[a]=used[b]=1;
		edge[a].push_back(b);
		edge[b].push_back(a);
	}
	ll cnt1=0;
	dfs(1,0,&s,0);
	cnt=0;
	dfs(s,0,&t,0);fa[s]=0;
	if(k==2){
		for(int i=t;i;i=fa[i]){
			used[i]=0;
		}
		dp(1,0);
		for(int i=1;i<=n;i++){
			cnt1=max(cnt1,dp1[i]+dp2[i]);
		}
		cnt1-=1;
	}
	ans=ans-cnt+1-cnt1;
	cout<<ans<<endl;
	return 0;
}
void dfs(ll num,ll pre,ll* r,ll sum){
	if(sum>cnt){
		cnt=sum;
		*r=num;
	}
	for(auto i:edge[num]){
		if(i!=pre){
			dfs(i,num,r,sum+1);
			fa[i]=num;
		}
	}
}
void dp(ll num,ll pre){
	for(auto i:edge[num]){
		if(i!=pre){
			dp(i,num);
			if(dp1[num]<=dp1[i]+used[i]*2-1){
				dp2[num]=dp1[num];
				dp1[num]=dp1[i]+used[i]*2-1;
			}else if(dp2[num]<=dp1[i]+used[i]*2-1){
				dp2[num]=dp1[i]+used[i]*2-1;
			}
		}
	}
}
2025/1/18 17:04
加载中...