zoukankan      html  css  js  c++  java
  • COJ 2003 选根 (树的重心)

    我们可以用树形DP在线性复杂度内搞定重心。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<queue>
     6 #include<cstring>
     7 #define PAU putchar(' ')
     8 #define ENT putchar('
    ')
     9 using namespace std;
    10 const int maxn=100000+10;
    11 struct tedge{int x,y,next;}adj[maxn<<1];int ms=0,fch[maxn];
    12 void addedge(int u,int v){
    13     adj[++ms]=(tedge){u,v,fch[u]};fch[u]=ms;
    14     adj[++ms]=(tedge){v,u,fch[v]};fch[v]=ms;
    15     return;
    16 }
    17 int s[maxn],f[maxn],cg,n;
    18 void findcg(int u,int fa){
    19     s[u]=1;int mxs=0;
    20     for(int i=fch[u];i;i=adj[i].next){
    21         int v=adj[i].y;if(v!=fa){
    22             findcg(v,u);
    23             s[u]+=s[v];
    24             mxs=max(mxs,s[v]);
    25         }
    26     } f[u]=max(n-s[u],mxs);
    27     if(f[u]<f[cg]) cg=u;
    28     else if(f[u]==f[cg]) cg=min(u,cg);return;//编号小的 
    29 }
    30 inline int read(){
    31     int x=0,sig=1;char ch=getchar();
    32     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
    33     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
    34     return x*=sig;
    35 }
    36 inline void write(int x){
    37     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    38     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
    39     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    40 }
    41 void init(){
    42     n=read();f[cg=0]=n;
    43     for(int i=1;i<n;i++) addedge(read(),read());
    44     findcg(1,0);
    45     write(cg);
    46     return;
    47 }
    48 void work(){
    49     return;
    50 }
    51 void print(){
    52     return;
    53 }
    54 int main(){init();work();print();return 0;}
  • 相关阅读:
    寒假 学习进度七
    寒假学习进度
    寒假学习进度五
    寒假学习进度四
    寒假学习进度三
    寒假学习进度二
    Spark实验五
    半篇论文笔记
    REPL
    Scala基本语法及操作、程序控制结构
  • 原文地址:https://www.cnblogs.com/chxer/p/4532036.html
Copyright © 2011-2022 走看看