• 树的重心


    •重心的性质:
    •性质 1 :树中所有点到某个点的距离和中,到重心的距离和是最小的,如果有两个重心,到他们的距离和一样。==最大的子树最小
    •性质 2 :把两棵树通过某一点相连得到一颗新的树,新的树的重心必然在连接原来两棵树重心的路径上。
    •性质 3 :一棵树添加或者删除一个节点,树的重心最多只移动一条边的位置。
     

    #include<bits/stdc++.h>
    const int N=1000010;
    const int inf=0x7f7f7f7f;
    using namespace std;
    int f[N],size[N],n,head[N],tot;
    int rt,sum;
    vector<int> G[N];
    void addedge(int u,int v){
    G[u].push_back(v);
    G[v].push_back(u);
    }
    inline void getrt(int u,int fa){
    size[u]=1;f[u]=0;
    for(int i=0;i<G[u].size();i++){
    int v=G[u][i];if(v==fa)continue;
    getrt(v,u);
    size[u]+=size[v];
    f[u]=max(f[u],size[v]);
    }
    f[u]=max(f[u],sum-size[u]);
    if(f[u]<f[rt])rt=u;
    }
    inline int read(){
    int f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
    }
    int main(){
    n=read();
    for(int i=1;i<n;i++){
    int u=read(),v=read();
    addedge(u,v);
    }
    rt=0;sum=n;f[0]=inf;getrt(1,0);
    printf("%d ",rt);
    return 0;
    }

  • 相关阅读:
    Alpha冲刺总结
    软工实践个人总结
    9组Beta冲刺3/5
    9组Beta冲刺总结
    9组Alpha冲刺6/6
    9组Beta冲刺2/5
    9组Alpha冲刺5/6
    9组Beta冲刺1/5
    cocos2d: 使用TexturePacker , pvr.ccz, CCSpriteBatchNode, CCSpriteFrameCache
    cocos2d: 设置容器透明度及添加UIViewController
  • 原文地址:https://www.cnblogs.com/zyfltyyz/p/11715436.html
Copyright © 2020-2023  润新知