列表

详情


NC231934. 变异蛮牛

描述

幽怨火,憎恨焰,变异蛮牛续执念。

给定一棵根为 1,且是黑点的有根树。

每个白点相邻所有的点都是黑点,每个黑点相邻所有的点都是白点。换句话说,你可以从根结点开始,按照深度对每个点黑白染色。

现在对于一条两个端点分别是 u,v 的链,定义其长度为:包含的黑点个数 - 包含的白点个数。

请你数一数 长度最大 的链的个数。

输入描述

全文第一行是 ,表示数据组数;

接下来 T 组数据,先输入一行一个正整数表示树的大小 

接下来输入 n-1 行每行两个正整数 表示树的一条边。

输出描述

输出 T 行,每行一个整数表示答案。

示例1

输入:

1
6
1 2
2 3
3 4
4 5
5 6

输出:

6

说明:

合法的链分别是:\{1\},\{3\},\{5\},\{1,2,3\},\{3,4,5\},\{1,2,3,4,5\}

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 443ms, 内存消耗: 21124K, 提交时间: 2022-01-21 19:30:39

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int i,j,k,n,m,t,it;
ll res;
vector<int> v[200500];

void dfs(int x,int fa,int y){
	if(y)res+=++it;
	for(auto i:v[x]){
		if(i!=fa)dfs(i,x,y^1);
	}
}

int main() {
	ios::sync_with_stdio(0);
	cin>>t;
	while(t--){
		cin>>n;
		res=0;it=0;
		for(i=1;i<=n;i++){
			v[i].clear();
		}
		for(i=1;i<n;i++){
			cin>>j>>k;
			v[j].push_back(k);
			v[k].push_back(j);
		}
		dfs(1,0,1);
		cout<<res<<'\n';
	}
}

上一题