zoukankan      html  css  js  c++  java
  • bzoj1131[POI2008]Sta*

    bzoj1131[POI2008]Sta

    题意:

    给出一个n个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大。n≤1000000。

    题解:

    两次dfs。第一次dfs维护子树的大小、节点的深度、以子树的根为根的子树深度和。第二次dfs维护以某节点为根除了以1为根时它的子树之外的所有节点的深度和。最后比较所有节点两个深度和相加的值。具体看代码。

    代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <queue>
     5 #define inc(i,j,k) for(int i=j;i<=k;i++)
     6 #define maxn 1000010
     7 #define ll long long
     8 using namespace std;
     9 
    10 inline int read(){
    11     char ch=getchar(); int f=1,x=0;
    12     while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    13     while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    14     return f*x;
    15 }
    16 struct e{int t,n;}es[maxn*2]; int g[maxn],ess;
    17 void pe(int f,int t){es[++ess]=(e){t,g[f]}; g[f]=ess;}
    18 ll ds[maxn],sz[maxn],fads[maxn],dep[maxn]; int n,ans,fa[maxn];
    19 void dfs1(int x){
    20     sz[x]=1; ds[x]=0;
    21     for(int i=g[x];i;i=es[i].n)if(es[i].t!=fa[x]){
    22         fa[es[i].t]=x; dep[es[i].t]=dep[x]+1; dfs1(es[i].t);
    23         sz[x]+=sz[es[i].t]; ds[x]+=ds[es[i].t]+sz[es[i].t];
    24     }
    25 }
    26 void dfs2(int x,ll a){
    27     fads[x]=a+n-sz[x]; ll sm=fads[x];
    28     for(int i=g[x];i;i=es[i].n)if(es[i].t!=fa[x])sm+=ds[es[i].t]+sz[es[i].t];
    29     for(int i=g[x];i;i=es[i].n)if(es[i].t!=fa[x])dfs2(es[i].t,sm-(ds[es[i].t]+sz[es[i].t]));
    30 }
    31 int main(){
    32     n=read(); inc(i,1,n-1){int x=read(),y=read(); pe(x,y); pe(y,x);} dfs1(1); dfs2(1,0); 
    33     ans=0; inc(i,1,n)if(fads[i]+ds[i]>fads[ans]+ds[ans])ans=i; printf("%d",ans); return 0;
    34 }

    20160919

  • 相关阅读:
    lrzsz on linux
    ASP.Net Core 运行在Linux(CentOS)
    ASP.Net Core 运行在Linux(Ubuntu)
    .Net程序跑在Linux上
    通过GitHub部署网站到Azure WebSite
    kubernetes报错
    第4篇创建harbor私有镜像库
    第1篇Kubernetes介绍
    第2篇Kubernetes架构
    第3篇K8S集群部署
  • 原文地址:https://www.cnblogs.com/YuanZiming/p/5890424.html
Copyright © 2011-2022 走看看