题意:

给定一颗树,将所有的叶子节点放到多个集合中,每一个集合必须满足该集合内任意两点之间的距离小于k,问最少需要多少个这样的集合。

思路:

本题是将所有距离小于k的叶子节点放到一个集合中。

我们可以先从小的方面进行考虑,如果是一个顶点,连接着3个叶子顶点,那我们应该如何合并,不难发现我们需要将三个叶子节点的深度进行排序,然后从后往前进行合并。

也就是说,现在对于一个节点来说,假如它有n个儿子,对于每个儿子来说,我们都保留该儿子 内所有叶子节点集合中 深度最浅的那一个集合的深度值,然后用这个深度值去和其他几个儿子深度最浅的集合进行合并。

这是一种贪心策略,因为在节点交汇处,集合之间的合并要根据该叶子节点集合深度最浅的那一个点来考虑,因为深度最浅的点合并成功的可能性最大。而不考虑其他深度的集合是否会导致错误?

很明显不会,因为如果一个集合可以和深度更深的集合进行合并,那么该集合一定可以和深度更浅的集合进行合并,由此我们只需考虑每个节点下面深度最浅的那个集合即可。

具体思路见代码。

代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#define rep(i,a,b) for(int i = a;i <= b;i++)
using namespace std;
const int N = 1e6+100;
const int M = 2*1e6+100;int n,k,tot,head[N],siz[N],ans;
struct Edge{int to,next;
}e[M];void init()
{tot = 1; memset(head,0,sizeof head);
}void add(int x,int y)
{e[++tot].to = y, e[tot].next = head[x], head[x] = tot;
}int dfs(int s,int fa)
{if(siz[s] == 1) return 0;vector<int> v;for(int i = head[s]; i ; i = e[i].next){int y = e[i].to;if(y == fa) continue;v.push_back(dfs(y,s)+1); //+1是因为到达父节点距离为1}sort(v.begin(),v.end()); //对所有儿子节点的最浅集合的最大深度进行排序while(v.size() >= 2){if(v.back() + v[v.size()-2] <= k)break;ans++;v.pop_back();}return v[v.size()-1];  //返回该节点下面集合深度最小的集合,看是否有合并的可能性
}int main()
{while(~scanf("%d%d",&n,&k)){init();rep(i,1,n-1){int x,y;scanf("%d%d",&x,&y);add(x,y), add(y,x);siz[x]++, siz[y]++;}rep(i,1,n){if(siz[i] > 1){dfs(i,-1);printf("%d\n",ans+1);break;}}}return 0;
}

【dfs+简单贪心】Leaf Sets【Codeforces Round #510 (Div. 2)】相关推荐

  1. Codeforces Round #510 (Div. 2)

    Codeforces Round #510 (Div. 2) https://codeforces.com/contest/1042 A 二分 1 #include<iostream> 2 ...

  2. Codeforces Round #510 (Div. 2) AB By cellur925

    第一次CF祭== 由于太菜了只做了前两题== 因为在第一题上耗费时间太多了,我还是太菜了==. A. Benches time limit per test 1 second memory limit ...

  3. Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...

  4. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

  5. Codeforces Round #167 (Div. 1) C. Dima and Horses(BFS+贪心)

    题目大意 有 n(1≤n≤3*105) 匹马,每条马都有几个敌人(不超过 3 个),现在要求把这些马分成两部分(允许一部分中没有一条马),使得对于每条马,和它在同一部分中的敌人的数量不超过1个 给出了 ...

  6. 贪心+构造 Codeforces Round #277 (Div. 2) C. Palindrome Transformation

    题目传送门 1 /* 2 贪心+构造:因为是对称的,可以全都左一半考虑,过程很简单,但是能想到就很难了 3 */ 4 /**************************************** ...

  7. Codeforces Round #579 (Div. 3) F2. Complete the Projects (hard version) dp + 贪心

    传送门 文章目录 题意: 思路: 题意: 思路: 排序方式跟easyeasyeasy版本的一样,但是hardhardhard版本是输出最多能选多少,所以我们对b<0b<0b<0的情况 ...

  8. Codeforces Round #656 (Div. 3) F. Removing Leaves 贪心 + 模拟

    传送门 文章目录 题意: 思路: 题意: 思路: 首先有一个贪心策略就是每次都找一个叶子节点最多的点,让后删掉他的kkk个叶子节点,现在我们就来考虑如何模拟这个过程. 我们整一个vector<s ...

  9. Codeforces Round #620 (Div. 2)(D. Shortest and Longest LIS)(O(n log n)的最长上升子序列或者贪心)

    Codeforces Round #620 (Div. 2)(D. Shortest and Longest LIS)(O(n log n)的最长上升子序列或者贪心) time limit per t ...

  10. DFS Codeforces Round #299 (Div. 2) B. Tavas and SaDDas

    题目传送门 1 /* 2 DFS:按照长度来DFS,最后排序 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #includ ...

最新文章

  1. Emacs之爬坑日记(一)
  2. java实现两个最大整数相加_JAVA-实现两个超大整数相加
  3. 剑指offer之C语言实现链表(两种方式)
  4. linux进程map,LInux环境运行mapReduce程序
  5. Project FreeEIM 2.0:重现失落的飞鸽传书
  6. 爬虫选用PPTP协议代理ip的必要性
  7. html信纸效果,纯css3实现信纸/同学录效果(代码示例)
  8. IIC详解之AT24C08
  9. 《硬件接入》海康威视接入及CPU性能优化思路
  10. dsp处理浮点数_DSP学习笔记(二)——DSP中浮点数与定点数格式与运算处理
  11. 零代码获取国家统计局省市县乡村5级行政区代码
  12. 2022年网络安全行业发展趋势
  13. win10虚拟机怎么连接服务器,win10自带虚拟机怎么链接服务器
  14. L2-3 小A爱旅游 (25 分)
  15. 【好文】太用力的人跑不远
  16. python小波变换去噪
  17. oracle创建序列号
  18. 宛如一个未来穿越者,终年33岁的印度数学天才,大数学家哈代说“他发现并创造了数学”
  19. 阿里巴巴 淘宝数据内核月报 目录(2014--2017)
  20. Glide加载动态图片

热门文章

  1. 关于TP模板的目录设置和渲染问题
  2. struts2 传递json对象时的延迟加载异常处理方法
  3. user and group
  4. CentOS上安装多版本Python问题
  5. 使用ERStudio创建数据表ER图并导出数据表的SQL(DDL)语句
  6. 无线AP与无线路由器都有些什么区别?(二)
  7. [导入]Asp.Net 学习资源列表
  8. phpstorm配置ftp,自动更新代码
  9. python调用库roc_curve()_解决ROC曲线画出来只有一个点的问题
  10. mapper同时添加数据只能添加一条_神器之通用mapper的使用