CF1042F Leaf Sets

版权声明:大佬您能赏脸,蒟蒻倍感荣幸,还请联系我让我好好膜拜。 https://blog.csdn.net/ShadyPi/article/details/82930399

原题链接:http://codeforces.com/contest/1042/problem/F

Leaf Sets

You are given an undirected tree, consisting of n n vertices.

The vertex is called a leaf if it has exactly one vertex adjacent to it.

The distance between some pair of vertices is the number of edges in the shortest path between them.

Let’s call some set of leaves beautiful if the maximum distance between any pair of leaves in it is less or equal to k k .

You want to split all leaves into non-intersecting beautiful sets. What is the minimal number of sets in such a split?

Input

The first line contains two integers n n and k ( 3 n 1 0 6 , 1 k 1 0 6 ) k (3≤n≤10^6, 1≤k≤10^6) — the number of vertices in the tree and the maximum distance between any pair of leaves in each beautiful set.

Each of the next n 1 n−1 lines contains two integers v i v_i and u i ( 1 v i , u i n ) u_i (1≤v_i,u_i≤n) — the description of the i i -th edge.

It is guaranteed that the given edges form a tree.

Output

Print a single integer — the minimal number of beautiful sets the split can have.

Examples
input

9 3
1 2
1 3
2 4
2 5
3 6
6 7
6 8
3 9

output

2

input

5 3
1 2
2 3
3 4
4 5

output

2

input

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

output

5

Note

Here is the graph for the first example:

题解

对于每个点维护最深的叶子离自己的距离,向上合并时,将所有儿子按最深的叶子离自己的距离排序,从深到浅遍历尝试合并,如果相邻的两个距离加起来大于 k k ,便无法合并,向上传也没有意义,于是就将该儿子及其子树单独分成一个集合,答案+1,最后返回在删去所有分离的儿子后最深的叶节点离自己的距离。

代码
#include<bits/stdc++.h>
#define add(a,b) mmp[a].push_back(b)
using namespace std;
const int M=1e6+5;
int ans,n,k;
vector<int>mmp[M];
int dfs(int f,int v)
{
	if(mmp[v].size()==1)return 0;
	vector<int>tmp;
	for(int i=mmp[v].size()-1;i>=0;--i)if(mmp[v][i]!=f)tmp.push_back(dfs(v,mmp[v][i])+1);
	sort(tmp.begin(),tmp.end());
	for(int siz;(siz=tmp.size())>1&&tmp[siz-1]+tmp[siz-2]>k;++ans,tmp.pop_back());
	return tmp.back();
}
void in(){scanf("%d%d",&n,&k);for(int i=1,a,b;i<n;++i)scanf("%d%d",&a,&b),add(a,b),add(b,a);}
void ac(){for(int i=1;i<=n;++i)if(mmp[i].size()>1)dfs(0,i),printf("%d",ans+1),exit(0);}
int main(){in(),ac();}

猜你喜欢

转载自blog.csdn.net/ShadyPi/article/details/82930399
今日推荐