[Lydsy1806月赛] 超速摄像头

题面在这里!

 

    可以证明只要叶子两两路径满足条件即可,于是便可以贪心啦,从最外圈(叶子)开始一层一层选,选出前 k/2 层。

    如果k是奇数的话,还可以多选一个不是前 k/2 层的点。

 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define pb push_back
const int N=1e6+5;

inline int read(){
    int x=0; char ch=getchar();
    for(;!isdigit(ch);ch=getchar());
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
    return x;
}

vector<int> g[N];
queue<int> q;
int n,k,len[N],ans,l,d[N];
bool flag;

inline void solve(){
	for(int x;!q.empty();q.pop()){
		x=q.front();
		for(int j=g[x].size()-1,i;j>=0;j--){
			i=g[x][j]; if((--d[i])==1) q.push(i),len[i]=len[x]+1;
		}
	}
}

int main(){
	n=read(),k=read(),l=k>>1;
	for(int i=1,uu,vv;i<n;i++){
		uu=read(),vv=read(),d[uu]++;
		g[uu].pb(vv),g[vv].pb(uu),d[vv]++;
	}
	
	for(int i=1;i<=n;i++) if(d[i]==1) q.push(i),d[i]--;
	solve();
	for(int i=1;i<=n;i++) if(len[i]<l) ans++; else flag=1;
	
	ans+=(k&1)&flag,printf("%d\n",ans);
	return 0;
}

 

posted @ 2018-07-06 20:20  蒟蒻JHY  阅读(197)  评论(0编辑  收藏  举报