我是靠谱客的博主 害怕镜子,最近开发中收集的这篇文章主要介绍健康监测计划,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目链接:健康监测计划


显然从叶子贪心是最优的。于是我们可以想到先取叶子,然后把叶子删掉,然后继续取叶子。

一共取 k/2 次叶子,如果k是奇数,最后再任意取一个点即可。

所以我们树上拓扑即可。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e6+10;
int n,k,deg[N],dep[N],res;
vector<int> g[N]; queue<int> q;
signed main(){
	cin>>n>>k;
	for(int i=1,a,b;i<n;i++){
		scanf("%d %d",&a,&b); deg[a]++,deg[b]++;
		g[a].push_back(b),g[b].push_back(a);
	}
	if(k==0||k==1) return cout<<k,0;
	for(int i=1;i<=n;i++) if(deg[i]==1) q.push(i),dep[i]=1;
	while(q.size()){
		int u=q.front(); q.pop(); res++;
		for(int to:g[u]){
			dep[to]=max(dep[to],dep[u]+1);
			if(dep[to]<=k/2&&--deg[to]==1) q.push(to);
		}
	}
	cout<<min(n,res+k%2);
	return 0;
}

最后

以上就是害怕镜子为你收集整理的健康监测计划的全部内容,希望文章能够帮你解决健康监测计划所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部