zoukankan      html  css  js  c++  java
  • 树的重心

    为学树的分治做准备。。。

    题目连接:POJ 1655

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 const int maxn=20010;
     6 const int inf=1<<30;
     7 int n,son[maxn],vis[maxn];
     8 int ans,maxson;
     9 struct edge
    10 {
    11     int v,nex;
    12 }e[maxn<<1];
    13 int head[maxn];
    14 int cnt=0;
    15 void add(int u,int v)
    16 {
    17     e[cnt].v=v;
    18     e[cnt].nex=head[u];
    19     head[u]=cnt++;
    20 }
    21 void init()
    22 {
    23     cnt=0;
    24     maxson=inf;
    25     memset(head,-1,sizeof(head));
    26     memset(vis,0,sizeof(vis));
    27 }
    28 void dfs(int u)
    29 {
    30     vis[u]=1;
    31     son[u]=0;
    32     int temp=0;
    33     for(int i=head[u];i!=-1;i=e[i].nex)
    34     {
    35         int v=e[i].v;
    36         if(!vis[v])
    37         {
    38             dfs(v);
    39             son[u]+=son[v]+1;
    40             temp=max(temp,son[v]+1);
    41         }
    42     }
    43     temp=max(temp,n-son[u]-1);
    44     if(temp<maxson||temp==maxson&&u<ans)
    45     {
    46         ans=u;
    47         maxson=temp;
    48     }
    49 }
    50 int main()
    51 {
    52     int t;
    53     scanf("%d",&t);
    54     while(t--)
    55     {
    56         init();
    57         scanf("%d",&n);
    58         for(int i=1;i<n;i++)
    59         {
    60             int u,v;
    61             scanf("%d%d",&u,&v);
    62             add(u,v);
    63             add(v,u);
    64         }
    65         dfs(1);
    66         printf("%d %d
    ",ans,maxson);
    67     }
    68 }
    View Code

    题目连接:POJ 3107

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<iostream>
     5 using namespace std;
     6 const int maxn=50010;
     7 const int inf=1<<30;
     8 int n,son[maxn],vis[maxn];
     9 int ans[maxn],maxson,num;
    10 struct edge
    11 {
    12     int v,nex;
    13 }e[maxn<<1];
    14 int head[maxn];
    15 int cnt=0;
    16 void add(int u,int v)
    17 {
    18     e[cnt].v=v;
    19     e[cnt].nex=head[u];
    20     head[u]=cnt++;
    21 }
    22 void init()
    23 {
    24     cnt=0;
    25     maxson=inf;
    26     memset(head,-1,sizeof(head));
    27     memset(vis,0,sizeof(vis));
    28 }
    29 void dfs(int u)
    30 {
    31     vis[u]=1;
    32     son[u]=0;
    33     int temp=0;
    34     for(int i=head[u];i!=-1;i=e[i].nex)
    35     {
    36         int v=e[i].v;
    37         if(!vis[v])
    38         {
    39             dfs(v);
    40             son[u]+=son[v]+1;
    41             temp=max(temp,son[v]+1);
    42         }
    43     }
    44     temp=max(temp,n-son[u]-1);
    45     if(temp<maxson)
    46     {
    47         ans[0]=u;
    48         num=1;
    49         maxson=temp;
    50     }
    51     else if(temp==maxson)
    52     {
    53         ans[num++]=u;
    54     }
    55 }
    56 int main()
    57 {
    58     while(scanf("%d",&n)!=EOF)
    59     {
    60         init();
    61         for(int i=1;i<n;i++)
    62         {
    63             int u,v;
    64             scanf("%d%d",&u,&v);
    65             add(u,v);
    66             add(v,u);
    67         }
    68         dfs(1);
    69         sort(ans,ans+num);
    70         for(int i=0;i<num-1;i++)
    71             printf("%d ",ans[i]);
    72         printf("%d
    ",ans[num-1]);
    73     }
    74 }
    View Code
  • 相关阅读:
    bzoj 3226 [Sdoi2008]校门外的区间(线段树)
    bzoj 1513 [POI2006]Tet-Tetris 3D(二维线段树)
    cf293E Close Vertices(树分治+BIT)
    点分治练习:不虚就是要AK
    点分治练习: boatherds
    bzoj 4016 [FJOI2014]最短路径树问题(最短路径树+树分治)
    bzoj 1876 [SDOI2009]SuperGCD(高精度+更相减损)
    464 整数排序Ⅱ
    445 余弦相似度
    488 快乐数
  • 原文地址:https://www.cnblogs.com/yijiull/p/6800045.html
Copyright © 2011-2022 走看看