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;
}
posted @ 2018-10-24 19:43  lokiii  阅读(190)  评论(0编辑  收藏