poj 1655 求树的重心

来源:互联网 发布:mac mysql 修改密码 编辑:程序博客网 时间:2024/06/09 16:44
<span style="font-family: Arial, Helvetica, sans-serif;">树的重心定义为:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡.  实际上树的重心在树的点分治中有重要的作用, 可以避免N^2的极端复杂度(从退化链的一端出发),保证NlogN的复杂度, 利用树型dp可以很好地求树的重心/*</span>
求树的重心,一个dfs即可重心的意义,在对树进行分治的时候可以避免N^2的极端复杂度(从退化链的一端出发),保证NlogN的复杂度 tit=Max(tit,num[v]); tit=Max(tit,n-1-num[u]);其中num[u]代表u的子树的节点数(包括u)*/#include<stdio.h>#include<string.h>#include<stdlib.h>#define N  21000#define inf 0x3fffffffstruct node{    int v,next;} bian[N*4];int head[N],yong,num[N],ma,minn,n;int cmp(const void *a,const void *b){    return *(int *)a-*(int *)b;}void addedge(int u,int v){    bian[yong].v=v;    bian[yong].next=head[u];    head[u]=yong++;}int Max(int v,int vv){    return v>vv?v:vv;}void  dfs(int u,int fa){    num[u]=1;    if(head[u]==-1)        return ;    int i,k=n,tit=-1;    for(i=head[u]; i!=-1; i=bian[i].next)    {        int v=bian[i].v;        if(v!=fa)        {            dfs(v,u);            num[u]+=num[v];            tit=Max(tit,num[v]);        }    }    tit=Max(tit,k-num[u]);    if(tit<minn)    {        minn=tit;        ma=u;    }    else if(tit==minn&&ma<u)        ma=u;    return ;}int main(){    int i,j,k,t;    scanf("%d",&t);    while(t--) {        scanf("%d",&n);        memset(head,-1,sizeof(head));        yong=0;        for(k=1; k<n; k++)        {            scanf("%d%d",&i,&j);            addedge(i,j);            addedge(j,i);        }        minn=inf;        memset(num,0,sizeof(num));        dfs(1,-1);     printf("%d %d\n",ma,minn);    }    return 0;}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 广州奥龙堡游泳卡过期了怎么办 大学生在学校当兵户口怎么办 茶叶梗枕头太硬怎么办 茶梗枕头太硬怎么办 照片放久了变红怎么办 乳腺萎缩和韧带松弛怎么办 航海王启航服务器爆满怎么办 LOL记分板没了怎么办 辅导孩子做作业没有耐心怎么办 宝宝住院三天回家不吃母乳怎么办 锁频君把应用变暗了怎么办 95的油加成92的怎么办 倒库一边宽了怎么办 倒库老是倒不好怎么办 倒库方向打早了怎么办 倒库左边小了怎么办 倒车入库小于30公分怎么办 倒库大于30公分怎么办 有行车记录仪遇到碰瓷怎么办 狗换了主人不吃怎么办 遇到扔东西碰瓷怎么办 碰见碰瓷的人怎么办 开店遇上碰瓷的顾客怎么办 我刮到别人的车怎么办 新车被刮了漆怎么办 停车擦到别人车怎么办 骑自行车被汽车撞了怎么办 车停在小区被刮怎么办 机动车被自行车撞了怎么办 单车撞小车后被起诉怎么办 给小车撞到电动单车怎么办 车停在路边被自行车撞怎么办 撞了碰瓷的人怎么办 谷丙转氨酶46该怎么办 渣土车开飞机了怎么办 自己车撞自己车怎么办 撞了人没钱赔怎么办 闯红灯扣了6分怎么办 开共享汽车闯红灯了怎么办 新手如果不小心闯红灯怎么办 红绿灯左转车道直行了怎么办