70pts求助
  • 板块P1395 会议
  • 楼主HCA_ac_life
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/25 19:00
  • 上次更新2024/7/25 19:55:28
查看原帖
70pts求助
1009001
HCA_ac_life楼主2024/7/25 19:00
#include<bits/stdc++.h>
using namespace std;
vector<int>edge[1000000];
bool vis[1000000];int dis[1000000];int sz[1000000];int dp[1000000];
int n;
int dfs(int pos,int s){
	if(vis[pos])return 0;
	vis[pos]=1;
	dis[pos]=s;
	int sum=0;
	for(int i=0;i<edge[pos].size();i++){
		int npos=edge[pos][i];
		sum+=dfs(npos,s+1);
	}
	sz[pos]=sum+1; 
	return sz[pos];
}
void solution(int pos,int fa){
	if(vis[pos])return;
	vis[pos]=1;
	dp[pos]=dp[fa]+n-2*sz[pos];
	cout<<pos<<" "<<dp[pos]<<endl;
	for(int i=0;i<edge[pos].size();i++){
		int npos=edge[pos][i];
		solution(npos,pos);
	}
}
int main(){
	cin>>n;
	for(int i=0,u,v;i<n-1;i++){
		cin>>u>>v;
		edge[u].push_back(v);
		edge[v].push_back(u);
	}
	dfs(1,0);
	memset(vis,0,sizeof(vis));
	vis[1]=1;
	for(int i=1;i<=n;i++)dp[1]+=dis[i];
	for(int i=0;i<edge[1].size();i++){
		int npos=edge[1][i];
		solution(npos,1);
	}
	int ans=10000000,res;
	for(int i=1;i<=n;i++){
		//cout<<sz[i]<<endl;
		if(dp[i]<ans){
			ans=dp[i];
			res=i;
		}
	}
	cout<<res<<" "<<ans<<endl;
	return 0;
}
2024/7/25 19:00
加载中...