D-智乃的K叉树

题目链接:https://ac.nowcoder.com/acm/contest/103957/D

题意:

对于一个无根树,要将其变为有根,且每个节点的儿子数量的最大值最小

思路:

本来一开始想让度数最大的节点的一个相邻点作为其父亲,然后一直向上搜索找到编号最小的父亲,结果WA
因为有可能有多个节点度数为最大值,而当编号为1的节点度数为最大值时这样做就错了,把1当作根并不会使1的儿子数量减少1

发现对于一个无根树,选择一个节点当作根,那么其他节点的儿子数必然减1,而根节点的儿子数不变,所以只需要找到度数非最大值且编号最小的节点当作根即可
注意特判big>1,ans=big-1,else ans=big;

void solve(){
	int n;cin>>n;
	vector<pii>din(n+1);
	for(int i=1;i<=n;i++)din[i].se=i;
	for(int i=1;i<=n-1;i++){
		int u,v;cin>>u>>v;
		din[u].fi++;din[v].fi++;
	}
	sort(din.begin()+1,din.end());
	int big=din[n].fi;
	int index=inf;
	int ans;
	if(din[1].fi==big){
		for(int i=1;i<=n;i++)index=min(index,din[i].se);	
	}else{
		for(int i=1;i<=n;i++){
			if(din[i].fi==big)break;
			index=min(index,din[i].se);
		}
	}
	if(big>1)ans=big-1;else ans=big;
	cout<<ans<<' '<<index<<endl;	
}
posted @ 2025-03-22 08:58  Marinaco  阅读(15)  评论(0)    收藏  举报
//雪花飘落效果