51Nod 1378 夹克老爷的愤怒

Description

一棵树,可以进行染色,被染色的点可以控制与它距离不超过 \(k\) 的所有点,问控制整棵树最少需要染几个点.

Sol

贪心.

记录一下最深的未染色点和最浅的染色点,判断一下能否在子树中就完成,不能的话就把权值赋成最深未染色点深度+1,能的话就赋成染色点深度+1.

需要特判一下根.

Code

#include<cstdio>
#include<vector>
#include<ctime>
#include<cstdlib>
#include<iostream>
using namespace std;

const int N = 100005;

int n,k,ans;
int f[N];
vector<int> g[N];

inline int in(int x=0,char ch=getchar()){ while(ch>'9' || ch<'0') ch=getchar();
	while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x; }
void DFS(int u,int fa){
	int mx=0,mi=0;
	for(int i=0,v;i<g[u].size();i++) if((v=g[u][i])!=fa){
		DFS(v,u);
		mx=max(mx,f[v]),mi=min(mi,f[v]);
	}
	if(mx+1 > k) f[u]=-k,ans++;
	else if(mx+mi+1>0) f[u]=mx+1;
	else f[u]=mi+1;
}
int main(){
	n=in(),k=in();
	for(int i=1,u,v;i<n;i++) u=in()+1,v=in()+1,g[u].push_back(v),g[v].push_back(u);
	DFS(1,-1);
	if(f[1]>0) ans++;
	cout<<ans<<endl;
	return 0;
}

  

转载于:https://www.cnblogs.com/beiyuoi/p/6026822.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值