码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj 4871: [Shoi2017]摧毁“树状图”【树形dp】

时间:2018-10-24 22:27:54      阅读:446      评论:0      收藏:0      [点我收藏+]

标签:ret   ios   html   分享图片   log   bubuko   struct   ==   bzoj   

做不来……参考https://www.cnblogs.com/ezyzy/p/6784872.html
技术分享图片

#include<iostream>
#include<cstdio>
using namespace std;
const int N=100005;
int T,o,n,h[N],cnt,f[N],g[N],q[N],q1[N],l[N],l1[N];
struct qwe
{
    int ne,to;
}e[N<<1];
int read()
{
    int r=0,f=1;
    char p=getchar();
    while(p>‘9‘||p<‘0‘)
    {
        if(p==‘-‘)
            f=-1;
        p=getchar();
    }
    while(p>=‘0‘&&p<=‘9‘)
    {
        r=r*10+p-48;
        p=getchar();
    }
    return r*f;
}
void add(int u,int v)
{
    cnt++;
    e[cnt].ne=h[u];
    e[cnt].to=v;
    h[u]=cnt;
}
inline int mx2(int a,int b)
{
    return a>b?a:b;
}
inline int mx3(int a,int b,int c)
{
    return mx2(a,mx2(b,c));
}
inline int mx4(int a,int b,int c,int d)
{
    return mx2(mx2(a,b),mx2(c,d));
}
inline int mx6(int a,int b,int c,int d,int e,int f)
{
    return mx2(mx2(a,b),mx2(mx2(c,d),mx2(e,f)));
}
void dfs(int u,int fa)
{
    int tot=0,mx=0;
    for(int i=h[u];i;i=e[i].ne)
        if(e[i].to!=fa)
        {
            dfs(e[i].to,u);
            int tf,tg,tq,tq1,tl,tl1;
            tf=mx4(f[u],f[e[i].to],q[e[i].to]+1,q1[e[i].to]+1);
            tg=mx6(g[u],g[e[i].to],f[u]+q[e[i].to],f[u]+q1[e[i].to],l[e[i].to]+1,l1[e[i].to]+1);
            tq=mx2(q[u]+1,q[e[i].to]+tot);
            tq1=mx2(q1[u]+1,q[u]+q[e[i].to]);
            tl=mx6(l[u]+1,l[e[i].to]+tot,q[u]+f[e[i].to],q1[u]+q[e[i].to],q1[e[i].to]+q[u],q[e[i].to]+mx);
            tl1=mx6(l1[u]+1,q1[e[i].to]+q1[u],l[u]+q[e[i].to],l[e[i].to]+q[u],q1[u]+f[e[i].to],q[e[i].to]+l[u]);
            mx=mx4(mx+1,tot+q1[e[i].to],tot+q[e[i].to],tot+f[e[i].to]);
            tot++;
            f[u]=tf,g[u]=tg,q[u]=tq,q1[u]=tq1,l[u]=tl,l1[u]=tl1;
        }
    q[u]=mx2(q[u],tot);
}
int main()
{
    T=read(),o=read();
    while(T--)
    {
        n=read();
        if(o==1)
            read(),read();
        else if(o==2)
            read(),read(),read(),read();
        for(int i=1;i<n;i++)
        {
            int x=read(),y=read();
            add(x,y),add(y,x);
        }
        dfs(1,0);
        printf("%d\n",mx3(g[1],l1[1],l[1]));
        cnt=0;
        for(int i=1;i<=n;i++)
            h[i]=0;
        for(int i=1;i<=n;i++)
            f[i]=g[i]=q[i]=q1[i]=l[i]=l1[i]=0;
    }
    return 0;
}

bzoj 4871: [Shoi2017]摧毁“树状图”【树形dp】

标签:ret   ios   html   分享图片   log   bubuko   struct   ==   bzoj   

原文地址:https://www.cnblogs.com/lokiii/p/9845672.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!