Description

给出一棵N个结点的树,选择L条路径,覆盖这些路径上的结点,使得被覆盖到的结点数最多。

Input

第一行两个正整数N、L(2 <= N <= 1,000,000, 0 <= L <= N)。下面有N-1行,每行两个正整数A和B(1 <= A, B <= N),表示一条边(A,B)。

首先有一个贪心:每一次选择的路径的两个端点都是两个叶子节点.
证明也很简单:如果端点不是叶子,那就在向下延申一点也一定不会更差.
先将所有叶子都列出来,假设有 $x$ 个,而我们可以选 $L$ 条路径.
由于每一条路径的两个端点都是叶子,所以我们如果只考虑叶子的话最多可以覆盖到 $2\times L$个.
然后与 $x$ 去一个 $min.$
但是,这么做是贪心选取更多的叶子,我们再继续考虑如何更多地选取每一个叶子的父亲.
假设我们只想取更多这一层的节点,那么我们和选叶子的策略是相同的.
而你会发现,这两个决策是不冲突的:之前一层的数量肯定大于现在这一层的数量.
所以,既然那 $L$ 条链都可以延申到下面的叶子了,也一定能完全覆盖到这一层的节点.
我们按照拓扑排序的方式从叶子节点开始扩展,答案即为 $\sum_{i=1}^{k}min(2L,num(i)).$

// luogu-judger-enable-o2
#include <queue>
#include <cstdio>
#include <algorithm>
#define N 1000005
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
queue<int>q;
int n,edges;
int deg[N],hd[N],to[N<<1],nex[N<<1],num[N],dep[N],vis[N];
void add(int u,int v)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
int main()
{
int i,j,L;
// setIO("input");
scanf("%d%d",&n,&L);
for(i=1;i<n;++i)
{
int a,b;
scanf("%d%d",&a,&b),add(a,b),add(b,a),++deg[a],++deg[b];
}
for(i=1;i<=n;++i) if(deg[i]==1) q.push(i),vis[i]=1;
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=hd[u];i;i=nex[i])
{
if(!vis[to[i]])
{
--deg[to[i]];
if(deg[to[i]]<=1)
vis[to[i]]=1,dep[to[i]]=dep[u]+1,q.push(to[i]);
}
}
}
for(i=1;i<=n;++i) ++num[dep[i]];
int ans=0;
for(i=0;i<=n;++i)
ans+=min(2*L,num[i]);
printf("%d\n",ans);
return 0;
}

  

luogu 3441 [POI2006]MET-Subway 拓扑排序+思维的更多相关文章

  1. ZOJ 4124 拓扑排序+思维dfs

    ZOJ - 4124Median 题目大意:有n个元素,给出m对a>b的关系,问哪个元素可能是第(n+1)/2个元素,可能的元素位置相应输出1,反之输出0 省赛都过去两周了,现在才补这题,这题感 ...

  2. CF思维联系--CodeForces -214C (拓扑排序+思维+贪心)

    ACM思维题训练集合 Furik and Rubik love playing computer games. Furik has recently found a new game that gre ...

  3. HDU 6073 Matching In Multiplication(拓扑排序+思维)

    http://acm.hdu.edu.cn/showproblem.php?pid=6073 题意:有个二分图,左边和右边的顶点数相同,左边的顶点每个顶点度数为2.现在有个屌丝理解错了最佳完美匹配,它 ...

  4. Luogu P1137 旅行计划 【拓扑排序+Dp】By cellur925

    题目传送门 由于满足游览先后顺序从西到东的性质,我们很自然的想到用拓扑排序处理出一个合理的游览顺序. 然鹅,之后呢? 事实上,拓扑排序常与Dp相结合,解决后效性.我们就可以在每次拓扑入队的时候更新答案 ...

  5. 2019牛客暑期多校训练营(第五场)H-subsequence 2 (拓扑排序+思维)

    >传送门< 题意: 给你几组样例,给你两个字符a,b,一个长度len,一个长度为len的字符串str,str是字符串s的子串 str是s删掉除过a,b两字符剩下的子串,现在求s,多种情况输 ...

  6. 洛谷 P4017 最大食物链计数 (拓扑排序,思维)

    题意:有\(n\)个点,连\(m\)条边,求最多有多少条食物链(从头走到为有多少条路径). 题解:之前抽了点时间把拓扑排序补完了,这题其实就是一道拓扑排序的裸题.关于拓扑排序: ​ 1.首先,我们用\ ...

  7. 第十二届湖南省赛 (B - 有向无环图 )(拓扑排序+思维)好题

    Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,…,n 编号. 设 count(x,y) 表示点 x 到点 y ...

  8. Sorting It All Out (拓扑排序+思维)

    An ascending sorted sequence of distinct values is one in which some form of a less-than operator is ...

  9. NOIP 车站分级 (luogu 1983 & codevs 3294 & vijos 1851) - 拓扑排序 - bitset

    描述 一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车 ...

随机推荐

  1. tensorflow零起点快速入门(1)

    导入: 其中的TF_CPP_MIN_LOG_LEVEL据说是为了忽略警告,但是我这里没有意义(numpy的一些警告) import tensorflow as tf import os os.envi ...

  2. 深入理解计算机系统 第十二章 并发编程 part1 第二遍

    三种构造并发程序的方法及其优缺点 1.进程 用这种方法,每个逻辑控制流都是一个进程,由内核来调度和维护.因为进程有独立的虚拟地址空间,想要和其他流通信,控制流必须使用某种显式的进程间通信机制. 优点: ...

  3. HTML——form表单中常用标签 form input (text hidden password radio checkbox reset submit ) select(option)总结

    <form action="" method="get"> <!-- placeholder="请输入文本" 显示提示 r ...

  4. linux 阿里云 新机器 安装jdk1.8

    2019年7月17日15:58:34 按着顺序来: wget https://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4f ...

  5. opencv 仿射变换 投射变换, 单应性矩阵

    仿射 estimateRigidTransform():计算多个二维点对或者图像之间的最优仿射变换矩阵 (2行x3列),H可以是部分自由度,比如各向一致的切变. getAffineTransform( ...

  6. json字符串对象

    1.将字符串转为json对象:JSON.parse(); 2.json对象转字符串:JSON.stringify(); <!DOCTYPE html> <html> <h ...

  7. css基础(代码)

    display: block; /*元素分为三大类,设置元素的显示方式}                                         行内 inlineli{            ...

  8. 解决npm安装node-sass太慢及编译错误问题

    环境: win7 node v8.11.1 npm v5.6.0 背景: 最近vue项目使用sass,所以需要sass-loader,sass-loader依赖node-sass,还需安装node-s ...

  9. frp 路由穿透(github开源穿透软件)

    server配置(windows):下载: https://github.com/fatedier/frp/releases [common] # 服务器端端口 bind_port = # 客户端连接 ...

  10. LeetCode NO477.汉明距离总和

    两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量. 计算一个数组中,任意两个数之间汉明距离的总和. 示例: 输入: 4, 14, 2 输出: 6 解释: 在二进制表示中,4表示为010 ...