• 树的重心


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

    题目连接: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
  • 相关阅读:
    程序书写规范
    点灯主要顺序
    复用功能重映射
    STM32 (战舰)
    html5 javascript 新增加的高级选择器更精准更实用
    html5 javascript 事件练习3键盘控制练习
    html5 javascript 事件练习3随机键盘
    html5 javascript 事件练习2
    html5 javascript 事件练习1
    html5dom2
  • 原文地址:https://www.cnblogs.com/yijiull/p/6800045.html
Copyright © 2020-2023  润新知