题目链接: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;
}