48pts求条
查看原帖
48pts求条
1352501
jms23012楼主2025/7/28 13:59

9-21WA,与答案差一两个数,讨论区没有Hack,样例可过。

#include <bits/stdc++.h>
using namespace std;
int n,k,zj[100005],ll[100005];
vector<pair<int,int> > ve[100005];
int dfs(int x,int fa){
	int len=ve[x].size();
	if(len==0) return 0;
	int max1=-1000005,max2=-2000005;
	for(int i=0;i<len;i++){
		if(ve[x][i].first==fa) continue;
		int an=dfs(ve[x][i].first,x)+ve[x][i].second;
		if(an>max1){
			max2=max1;
			max1=an;
		}
		else if(an>max2){
			max2=an;
		}
	}
	int t=0;
	if(max1>0) t+=max1;
	if(max2>0) t+=max2;
	zj[x]=t;
	ll[x]=max1>0?max1:0;
	return max1>0?max1:0;
}
void insert(int x,int fa){
	int len=ve[x].size();
	int maxx=-1,maxplace=-1;
	for(int i=0;i<len;i++){
		if(ve[x][i].first==fa) continue;
		if(ll[ve[x][i].first]>maxx){
			maxx=ll[ve[x][i].first];
			maxplace=i;
		}
	}
	if(maxplace!=-1){
		ve[x][maxplace].second=-1;
		ve[ve[x][maxplace].first].erase(remove(ve[ve[x][maxplace].first].begin(),ve[ve[x][maxplace].first].end(),make_pair(x,1)),ve[ve[x][maxplace].first].end());
		ve[ve[x][maxplace].first].push_back(make_pair(x,-1));
		insert(ve[x][maxplace].first,x);
	}
}
int main(){
	cin>>n>>k;
	int u,v;
	for(int i=1;i<=n-1;i++){
		cin>>u>>v;
		ve[u].push_back(make_pair(v,1));
		ve[v].push_back(make_pair(u,1));
	}
	dfs(1,-1);
	int maxx=-1000,place=0;;
	for(int i=1;i<=n;i++){
		if(zj[i]>maxx) place=i;
		maxx=max(maxx,zj[i]);
	}
	if(k==1){
		cout<<2*(n-1)-maxx+1<<endl;
		return 0;
	}
	int len=ve[place].size();
	int max1=-1,max2=-1,max1place=-1,max2place=-1;
	for(int i=0;i<len;i++){
		if(ll[ve[place][i].first]>max1){
			max2=max1;
			max2place=max1place;
			max1=zj[ve[place][i].first];
			max1place=i;
		}
		else if(ll[ve[place][i].first]>max2){
			max2place=i;
			max2=zj[ve[place][i].first];;
		}
	}
	if(max1>-1){
		ve[place][max1place].second=-1;
		ve[ve[place][max1place].first].erase(remove(ve[ve[place][max1place].first].begin(),ve[ve[place][max1place].first].end(),make_pair(place,1)),ve[ve[place][max1place].first].end());
		ve[ve[place][max1place].first].push_back(make_pair(place,-1));
		insert(ve[place][max1place].first,place);
	}
	if(max2>-1){
		ve[place][max2place].second=-1;
		ve[ve[place][max2place].first].erase(remove(ve[ve[place][max2place].first].begin(),ve[ve[place][max2place].first].end(),make_pair(place,1)),ve[ve[place][max2place].first].end());
		ve[ve[place][max2place].first].push_back(make_pair(place,-1));
		insert(ve[place][max2place].first,place);
	}
//	for(int i=1;i<=n;i++){
//		int len=ve[i].size();
//		for(int j=0;j<len;j++){
//			cout<<i<<' '<<ve[i][j].first<<ve[i][j].second<<endl;
//		}
//		cout<<endl;
//	}
	dfs(1,-1);
	int maxx1=-1000,place1=0;
	for(int i=1;i<=n;i++){
		if(zj[i]>maxx1) place1=i;
		maxx1=max(maxx1,zj[i]);
	}
	maxx1=max(maxx1,0);
	cout<<2*(n-1)-maxx+1-maxx1+1<<endl;
	return 0;
}
2025/7/28 13:59
加载中...