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;
}

 

posted @ 2023-09-29 08:22  JMXZ  阅读(17)  评论(0)    收藏  举报