这道题其实很简单,求k个到根的链,使得链上的节点的个数尽可能多,如果节点被计算过了,就不能再被计算了,其实我们发现,只要k>=叶子节点,那么肯定是全部,所以我们考虑所有的叶子节点,DFS到根节点后,往上递归,我们能比较容易的求出某个节点,所有儿子节点的最深深度,那么对于上面一个节点,其实只有一个最长那个影响,所有我们可以保存每个节点的最深深度,然后往上递归,递归到某个节点的时候,查询所有子树的最深深度,把这个最深深度+1当场当前节点的最深深度,其他节点实际上已经变成链了,那么我们用优先队列保存所有的链,也就是对应链的长度,然后找出前k大的链,求和即可,这样就不会重复了。

#include<bits/stdc++.h>
using namespace std;
const int maxx = 2e5+;
int ver[maxx],edge[maxx],head[maxx],Next[maxx];
int n,k,tot;
priority_queue<int>q;
int d[maxx];
void add(int x,int y){
ver[++tot]=y;Next[tot]=head[x];head[x]=tot;
ver[++tot]=x;Next[tot]=head[y];head[y]=tot;
}
int dfs(int u,int fa){
d[u]=;
priority_queue<int>s;
s.push(d[u]);
for (int i=head[u];i;i=Next[i]){
int v=ver[i];
if (v==fa)continue;
dfs(v,u);
s.push(d[v]+);
}
d[u]=s.top();
s.pop();
while(s.size()){
q.push(s.top()-);
s.pop();
}
}
int main(){
while(~scanf("%d%d",&n,&k)){
for (int i=;i<=n;i++){
int tmp;
scanf("%d",&tmp);
add(i,tmp);
}
dfs(,);
q.push(d[]);
int sz=q.size();
int ans=;
for (int i=;i<=min(sz,k);i++){
ans+=q.top();
q.pop();
}
printf("%d\n",ans);
}
return ;
}

D - Denouncing Mafia DFS的更多相关文章

  1. Gym - 102346D Denouncing Mafia 取k叶子节点使叶子到根覆盖节点数最大

    给你一棵树 你可以取K条链 一条链为根到叶子的路径 问你K条链最多覆盖树上多少个节点 贪心的做 肯定是每次取最长链 但是取完最长链 一颗树就会变为若干个森林 我们要维护当前所有森林里的最长链 ans数 ...

  2. gym102346题解

    B Buffoon 判断最大值是不是第一个数,签到题. H Hour for a Run 输出\(n*m\)的\(10\%\)到\(90\%\),签到题,注意别用浮点数和ceil,有精度问题. M M ...

  3. 树上前k大的包含不重复结点的长链

    一棵树,不一定是二叉树,在每个结点最多只属于一条链的情况下,处理出其中最长的前k个的长度. 最近训练赛做到两道题了,有必要总结一下. 不过我不知道是否有更专门的叫法. 借鉴了这位大佬的博客:https ...

  4. 2019-2020 ACM-ICPC Brazil Subregional Programming Contest (11/13)

    \(2019-2020\ ACM-ICPC\ Brazil\ Subregional\ Programming\ Contest\) \(A.Artwork\) 并查集,把检测区域能在一起的检测器放在 ...

  5. [BZOJ1163][BZOJ1339][Baltic2008]Mafia

    [BZOJ1163][BZOJ1339][Baltic2008]Mafia 试题描述 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警方希望使用 ...

  6. 1339 / 1163: [Baltic2008]Mafia

    1163: [Baltic2008]Mafia Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 96  Solved: 60[Submit][Statu ...

  7. 1163: [Baltic2008]Mafia

    1163: [Baltic2008]Mafia Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 123  Solved: 70[Submit][Stat ...

  8. [BZOJ1163&1339]Mafia

    [Baltic2008]Mafia 题目 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后, ...

  9. bzoj1339[Baltic2008]Mafia*

    bzoj1339[Baltic2008]Mafia 题意: 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控.对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得 ...

随机推荐

  1. Eclipse、MinGW、JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法)

     Eclipse.MinGW.JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法) 问题背景:之前的JNI编程都是基于And ...

  2. jeecms 强大的采集功能优化 转载 https://blog.csdn.net/jeff06143132/article/details/7099003

    ========================================================= 没办法附件上传不了,AcquisitionSvcImpl.java类: //---- ...

  3. WPF内嵌CEF控件,与JS交互

    1)安装cefsharp.winform包 打开VS2017,打开nuget,找到cefsharp.winform,安装 问:为什么wpf程序不使用cefsharp.wpf? 答:因为cefwpf 4 ...

  4. Java问题解读系列之String相关---String类的常用方法?

    今天的题目是:String类的常用方法? 首先,我们在eclipse中定义一个字符串,然后使用alt+/就会出现String类的所有方法,如下图所示: 下面我就挑选一些常用的方法进行介绍: 首先定义两 ...

  5. vue单页应用中,使用setInterval()定时向服务器获取数据,后来跳转页面后,发现还在不停的获取数据。

    使用VUE开发单页项目时遇到这样的问题,mounted中使用setInterval()定时向服务器获取数据,后来跳转页面后,发现还在不停的获取数据.我以为是因为我路由用的push导致的,改成repla ...

  6. 查漏补缺&#183;补丁计划

    趁着神志清醒赶紧写一下. 多次考试暴露出各种问题.新的知识点先不去搞了,最近多做一些不擅长的类型的题查漏补缺一下吧. 唔,首先是比较考验思维的类型,我智商太低又刷题少不会什么套路,只能最近赶紧赶一下进 ...

  7. 2018-2-13-wpf-如何使用-Magick.NET-播放-gif-图片

    title author date CreateTime categories wpf 如何使用 Magick.NET 播放 gif 图片 lindexi 2018-2-13 17:23:3 +080 ...

  8. hdu 1296 Polynomial Problem(多项式模拟)

    Problem Description We have learned how to obtain the value of a polynomial when we were a middle sc ...

  9. 2019阿里云开年Hi购季新用户分会场全攻略!

    2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段.3月04日-3月16日的新购满返+5折抢购阶段.3月16日-3 ...

  10. vim中NERDTREE插件的使用

    一个显示目录树的插件,很不错 学习于: http://blog.csdn.net/xiongzhengxiang/article/details/7375607