题目大意:给定一棵树,1为首都(首都可以是工业城市也可以是旅游城市),一共有n个点。

其中要选出k个工业城市,每个工业城市出一个代表去首都,其快乐值是其途径旅游城市(非工业)的个数

求所有快乐值相加的最大值。

emmm这题真的就差一点点啊......

\(\color{Orange}{------------------我是华丽的分割线(●ˇ∀ˇ●)-----------------------}\)

通过观察题目发现选工业城市是有明显的收益的。

比如,选的话最好选叶子节点,叶子节点中选深度较大的又比较好。

如果只选一个城市的话,那肯定选深度最大的叶子。现在选K个,难点在哪里?

在于选了某个节点后,\(\color{Red}{如果再选它的祖先节点,它的收益就会发生变化(减少1)}\).

动态的过程是很难分析的。

不过这里没必要说叶子的收益减少1,不如让它的祖先节点的收益减少1,这样每个节点的收益都是固定的。

这样的话,得到这样一个式子。(dp表示收益,deep表示深度,size表示子树大小)

\[dp[u]=deep[u]-size[u]+1
\]

这样只要先选子节点,再选父节点,收益都被我们算出来了,对dp数组排个序取k个最大的就行。

\(那会不会不选子节点,只选父节点呢?那dp[u]=deep[u]呀!我们的收益就算错了呀!!\)

\(怎么可能......傻也要有个限度呀哈哈!明显子节点的dp值更大,排序后肯定是先选的子节点......\)

#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+9;
ll n,m,deep[maxn],Size[maxn],ans,f[maxn];
struct node{
int to,nxt;
}d[maxn*2];int head[maxn*2],cnt=1;
void add(int u,int v){
d[cnt].nxt=head[u],d[cnt].to=v,head[u]=cnt++;
}
void dfs(int now,int fa)
{
deep[now]=deep[fa]+1;
Size[now]=1;
int son=0;
for(int i=head[now];i;i=d[i].nxt)
{
if(d[i].to!=fa)
{
son++;
dfs(d[i].to,now);
Size[now]+=Size[d[i].to];
}
}
f[now]=deep[now]-Size[now]+1;
}
void ddp(int now,int fa)
{
for(int i=head[now];i;i=d[i].nxt)
{
int v=d[i].to;
if(v==fa) continue; }
}
int main()
{
cin>>n>>m;
for(int i=1;i<n;i++)
{
int l,r;
scanf("%d%d",&l,&r);
add(l,r);add(r,l);
}
deep[1]=-1;
dfs(1,1);
sort(f+1,f+1+n);
for(int i=n;i>=n-m+1;i--) ans+=f[i];
cout<<ans;
return 0;
}

最新文章

  1. svn迁移gitlab,构建前端打包发布流程
  2. 如何在Mac OSX 10.10上安装GDB
  3. Log4Net简单使用
  4. xcode7.3 升级 xcode8.0 后权限设置问题(升级xcode 8.0 后构建版本不显示问题)
  5. CSS3 绘制360安仔小精灵[原创]
  6. HTML xmlns
  7. 基于WebForm+EasyUI的业务管理系统形成之旅 -- ParamQueryGrid行、列合并(Ⅸ)
  8. (经典)tcp粘包分析
  9. 安卓工程中定义的app_name等报错解决办法 工程上有叹号
  10. lvs_dr
  11. Array和ArrayList的异同点
  12. bbs项目学习到的知识点(orm中的extra)
  13. Promise注意点
  14. js中html拼接
  15. Oracle date 详解
  16. [LeetCode] 系统刷题4_Binary Tree &amp; Divide and Conquer
  17. [转]git提交代码时遇到代码库有更新以及本地有更新的解决方法
  18. asp.net core模块学习
  19. HTML 选择目录
  20. iconfont.cn批量加入

热门文章

  1. 智能指针 shared_ptr
  2. 【python实现卷积神经网络】Flatten层实现
  3. delphi中DateTimePicker控件同时输入日期和时间
  4. mapstruct使用详解
  5. 10.添加script标签,判断onload是否完成
  6. [V&amp;N2020 公开赛]TimeTravel 复现
  7. BI报表分析和数据可视化,推荐这三个开源工具!
  8. vue3开发饿了么商城2020年新版本
  9. Python操作MySQL之查看、增删改、自增ID
  10. Python初学者常见错误问题汇总