记录编号 492445 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [HEOI 2017] 摧毁“树状图” 最终得分 100
用户昵称 GravatarFuryton 是否通过 通过
代码语言 C++ 运行时间 2.921 s
提交时间 2018-03-26 07:30:38 内存使用 3.14 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define File(x) "treediagram."#x
#define For(i,s,e) for(int i=(s); i<=(e); i++)
#define Rep(i,s,e) for(int i=(s); i>=(e); i--)
#define Max(a, b) a=(a>b?a:b)
using namespace std;
typedef long long LL;
const int N=100000+1;
struct Node{
	int x,nxt;
}T[N];

priority_queue<int>F;
int n, Q, h[N], len, x, p0, u, v;
int f[N][2], g[N][2][2], son[N];

void addEdge(int x, int y){
	T[++len]=(Node){y, h[x]}; h[x]=len;
}

void dfs(int,int);

int main()
{
	freopen(File(in),"r",stdin);
	freopen(File(out),"w",stdout);

	scanf("%d%d",&Q,&x);
	while(Q--){
		memset(h,0,sizeof(h)); len=0;

		scanf("%d",&n);
		if(x==1) For(i,1,2) scanf("%d",&p0);
		if(x==2) For(i,1,4) scanf("%d",&p0);

		For(i,1,n-1){
			scanf("%d%d",&u,&v);
			addEdge(u, v); addEdge(v, u);
		}
		dfs(1,0);

		printf("%d\n",max(son[1]?g[1][1][0]+1:0, g[1][1][1]));
	}

    return 0;
}
void dfs(int x, int fa){
	son[x]=0; f[x][0]=f[x][1]=g[x][0][0]=g[x][0][1]=g[x][1][0]=g[x][1][1]=0;
	for(int p=h[x]; p; p=T[p].nxt){
		if(T[p].x==fa) continue;
		dfs(T[p].x, x); son[x]++;
	}

	while(!F.empty()) F.pop();
	for(int p=h[x]; p; p=T[p].nxt){
		if(T[p].x==fa) continue;
		int s=T[p].x, s2;

		F.push(f[s][0]);
		Max(f[x][0], son[x]); Max(f[x][0], f[s][0]+son[x]-1);

		Max(f[x][1], g[s][0][0]+son[x]); Max(f[x][1], g[s][0][1]+son[x]-1);
		Max(f[x][1], f[s][1]+son[x]-1);
		Max(f[x][1], f[s][0]+son[x]-1); Max(f[x][1], son[x]);

		Max(g[x][0][0], g[s][0][0]); Max(g[x][0][0], g[s][0][1]);
		Max(g[x][0][1], son[x]); Max(g[x][0][1], f[s][0]+son[x]-1);

		Max(g[x][1][0], g[s][1][0]); Max(g[x][1][0], g[s][1][1]);
		Max(g[x][1][0], g[s][0][0]); Max(g[x][1][0], g[s][0][1]);

		Max(g[x][1][1], g[s][0][1]+son[x]-1); Max(g[x][1][1], g[s][0][0]+son[x]);
		Max(g[x][1][1], f[s][1]+son[x]-1); 
		Max(g[x][1][1], son[x]); //Max(g[x][1][1], g[s][1][1]);

		for(int p2=h[x]; p2; p2=T[p2].nxt){
			if(T[p2].x==fa || T[p2].x==s) continue;
			s2=T[p2].x;
			Max(f[x][1], f[s][0]+g[s2][0][0]+son[x]-1);
			Max(f[x][1], f[s][0]+g[s2][0][1]+son[x]-2);

			Max(g[x][0][1], f[s][0]+f[s2][0]+son[x]-2);

			Max(g[x][1][0], max(g[s][0][0], g[s][0][1])+max(g[s2][0][0], g[s2][0][1]));
			Max(g[x][1][1], f[s][0]+f[s2][0]+son[x]-2);
			Max(g[x][1][1], f[s][0]+f[s2][1]+son[x]-2);
			Max(g[x][1][1], f[s][0]+g[s2][0][0]+son[x]-1);
			Max(g[x][1][1], f[s][0]+g[s2][0][1]+son[x]-2); 

			for(int p3=h[x]; p3; p3=T[p3].nxt){
				if(T[p3].x==fa || T[p3].x==s || T[p3].x==s2) continue;
				int s3=T[p3].x;
				Max(g[x][1][1], f[s][0]+f[s2][0]+g[s3][0][1]+son[x]-3);
				Max(g[x][1][1], f[s][0]+f[s2][0]+g[s3][0][0]+son[x]-2);
			}
		}
	}
	if(!F.empty()){
		int tmp3=son[x]-3, tmp4=son[x]-4;
		if(son[x]>=3){
			For(i,1,3){
				tmp3+=F.top(); tmp4+=F.top(); F.pop();
			}
			if(son[x]>=4){
				tmp4+=F.top();
			}
			Max(f[x][1], tmp3); Max(g[x][1][1], tmp3); Max(g[x][1][1], tmp4);
		}
	}
}