树形dp爆wa求助
查看原帖
树形dp爆wa求助
752094
MornHus楼主2023/5/31 13:48
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
int n;
int k;
int l;
int dp[maxn];
int deep[maxn];
int dis[maxn];
int midpoint;
vector<int>tree[maxn];
int ans;
void dfs(int now,int fa){
	int max1=0;
	int max2=0;
//	cout<<now<<' '<<fa;
	for(int i=0;i<tree[now].size();i++){
		int v=tree[now][i];
		if(v==fa)continue;
		dfs(v,now);
		int temp=dp[v]+1;
		dp[now]=max(temp,dp[now]);
		if(temp>max1)max2=max1,max1=temp;
		else if(temp>max2)max2=temp;
	}
	if(l<max1+max2){
		midpoint=now;
		l=max1+max2;
	}
//	cout<<l<<endl;
}
void dfs1(int now,int fa){
	int max1=0;
	int max2=0;
//	cout<<now<<' '<<fa;
	deep[now]=deep[fa]+1;
	dp[now]=deep[now];
	for(int i=0;i<tree[now].size();i++){
		int v=tree[now][i];
		if(v==fa)continue;
		dfs1(v,now);
		dp[now]=max(dp[v],dp[now]);
	}
	dis[now]=dp[now]-deep[now];
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>k;
	for(int i=1,u,v;i<n;i++){
		cin>>u>>v;		
		tree[u].push_back(v);
		tree[v].push_back(u);
	}
	dfs(1,0);
	dfs1(midpoint,0);
	sort(dis+1,dis+n+1);
	cout<<dis[n-k];
	return 0;
}
2023/5/31 13:48
加载中...