P1395 会议
求出重心+节点到重心距离
/* Çó³öÊ÷µÄÖØÐÄ + ¼ÆËã³öÿ¸ö½Úµãµ½ ÖØÐĵľàÀë */ #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> //#include<queue> //#include<vector> #include<bits/stdc++.h> #define ll long long #define ddd printf("-----------------------\n"); using namespace std; const int maxn=5e4+10 ; const int inf=0x3f3f3f3f; int n,head[maxn],to[maxn<<1],nxt[maxn<<1],tot,dp[maxn],siz[maxn]; int dis[maxn],vis[maxn],zx,sonsm=inf,ans; void add(int u,int v){ to[++tot]=v,nxt[tot]=head[u],head[u]=tot; } void dfs(int x,int faa){ siz[x]=1; for(int i=head[x];i;i=nxt[i]) { int v=to[i];if(v==faa) continue; dfs(v,x); siz[x]+=siz[v]; dp[x]=max(dp[x],siz[v]); } dp[x]=max(dp[x],n-siz[x]); if(sonsm>dp[x]||sonsm==dp[x]&&zx>x){ sonsm=dp[x]; zx=x; } } void spfa(int root) { memset(dis,inf,sizeof(dis)); queue<int> q; q.push(root),dis[root]=0,vis[root]=1; while(q.empty()==0) { int u=q.front();q.pop();vis[u]=0; for(int i=head[u];i;i=nxt[i]) { int v=to[i]; if(dis[v]>dis[u]+1){ dis[v]=dis[u]+1; if(vis[v]==0) q.push(v),vis[v]=1; } } } } int main() { ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n-1;i++){ int a,b;cin>>a>>b; add(a,b),add(b,a); } dfs(1,1); spfa(zx); for(int i=1;i<=n;i++) ans+=dis[i]; cout<<zx<<" "<<ans; return 0; }