BZOJ 1131 [POI2008]Sta 树形DP

来源:互联网 发布:特朗普 中美关系 知乎 编辑:程序博客网 时间:2024/05/17 08:05

题意:

方法:裸树形DP。。

解析:

我今天做的怎么都是大水题- -!

明明有你不会的!

每个节点向下以及向上深度两边dfs就行辣。

式子还用列?- -

随便画个图yy就好了

代码:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define N 1000100using namespace std;typedef long long ll;int n;int head[N],cnt;struct node{    int from,to,next;}edge[N<<1];ll siz[N],dow[N],upp[N],fa[N];void init(){    memset(head,-1,sizeof(head));    cnt=1;}void edgeadd(int from,int to){    edge[cnt].from=from,edge[cnt].to=to,edge[cnt].next=head[from];    head[from]=cnt++;}void dfs1(int now,int ff){    fa[now]=ff,siz[now]=1;    for(int i=head[now];i!=-1;i=edge[i].next)    {        int to=edge[i].to;        if(to==ff)continue;        dfs1(to,now);        siz[now]+=siz[to];        dow[now]+=dow[to]+siz[to];    }}void dfs2(int now){    if(now!=1)        upp[now]=upp[fa[now]]+dow[fa[now]]-dow[now]-2ll*siz[now]+n;    for(int i=head[now];i!=-1;i=edge[i].next)    {        int to=edge[i].to;        if(to==fa[now])continue;        dfs2(to);    }}int main(){    init();    scanf("%d",&n);    for(int i=1;i<n;i++)    {        int x,y;        scanf("%d%d",&x,&y);        edgeadd(x,y);        edgeadd(y,x);    }    dfs1(1,0);    dfs2(1);    ll ans=0;    int no;    for(int i=1;i<=n;i++)    {        if(upp[i]+dow[i]>ans)        {            ans=upp[i]+dow[i];            no=i;        }    }    printf("%d\n",no);} 
0 0
原创粉丝点击