bzoj 4871: [Shoi2017]摧毁“树状图”【树形dp】
做不来……参考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;
}