luogu 3441 [POI2006]MET-Subway 拓扑排序+思维
Description
Input
首先有一个贪心:每一次选择的路径的两个端点都是两个叶子节点.
证明也很简单:如果端点不是叶子,那就在向下延申一点也一定不会更差.
先将所有叶子都列出来,假设有 $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 拓扑排序+思维的更多相关文章
- ZOJ 4124 拓扑排序+思维dfs
ZOJ - 4124Median 题目大意:有n个元素,给出m对a>b的关系,问哪个元素可能是第(n+1)/2个元素,可能的元素位置相应输出1,反之输出0 省赛都过去两周了,现在才补这题,这题感 ...
- CF思维联系--CodeForces -214C (拓扑排序+思维+贪心)
ACM思维题训练集合 Furik and Rubik love playing computer games. Furik has recently found a new game that gre ...
- HDU 6073 Matching In Multiplication(拓扑排序+思维)
http://acm.hdu.edu.cn/showproblem.php?pid=6073 题意:有个二分图,左边和右边的顶点数相同,左边的顶点每个顶点度数为2.现在有个屌丝理解错了最佳完美匹配,它 ...
- Luogu P1137 旅行计划 【拓扑排序+Dp】By cellur925
题目传送门 由于满足游览先后顺序从西到东的性质,我们很自然的想到用拓扑排序处理出一个合理的游览顺序. 然鹅,之后呢? 事实上,拓扑排序常与Dp相结合,解决后效性.我们就可以在每次拓扑入队的时候更新答案 ...
- 2019牛客暑期多校训练营(第五场)H-subsequence 2 (拓扑排序+思维)
>传送门< 题意: 给你几组样例,给你两个字符a,b,一个长度len,一个长度为len的字符串str,str是字符串s的子串 str是s删掉除过a,b两字符剩下的子串,现在求s,多种情况输 ...
- 洛谷 P4017 最大食物链计数 (拓扑排序,思维)
题意:有\(n\)个点,连\(m\)条边,求最多有多少条食物链(从头走到为有多少条路径). 题解:之前抽了点时间把拓扑排序补完了,这题其实就是一道拓扑排序的裸题.关于拓扑排序: 1.首先,我们用\ ...
- 第十二届湖南省赛 (B - 有向无环图 )(拓扑排序+思维)好题
Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,…,n 编号. 设 count(x,y) 表示点 x 到点 y ...
- Sorting It All Out (拓扑排序+思维)
An ascending sorted sequence of distinct values is one in which some form of a less-than operator is ...
- NOIP 车站分级 (luogu 1983 & codevs 3294 & vijos 1851) - 拓扑排序 - bitset
描述 一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车 ...
随机推荐
- 虚拟机(Vmware)安装ubuntu18.04和配置调整(一)
一.虚拟机(Vmware)安装ubuntu18.04 1.下载ubuntu18.04桌面版镜像文件< ubuntu-18.04.3-desktop-amd64.iso> 2.使用VMwar ...
- Linux就该这么学——新手必须掌握的命令之文件编辑命令组
cat 命令 用途 : 用于查看纯文本文件 格式 : cat [选项] [文件] 示例 : more 命令 用途 : 用于查看纯文本文件(内容较多的),可以用”Enter” 键或者”Space”键向下 ...
- X86逆向13:向程序中插入Dll
本章我们将学习Dll的注入技巧,我们将把一个动态链接库永久的插入到目标程序中,让程序在运行后直接执行这个Dll文件,这一章的内容也可以看作是第八课的加强篇,第八课中我们向程序中插入了一个弹窗,有木有发 ...
- ModbusRtu通信报文详解【二】
这里接着上一篇内容对ModbusRtu的通信报文做个详细描述: [1]强制单个线圈 功能码:05H [2]预置单个寄存器 功能码:06H [3]强制多个线圈 功能码;0FH [4]预置多个寄存器 功能 ...
- QT 安卓动态获取权限
一:在AndroidManifest.xml文件中赋予相关权限 二: package ckdz.Appproject; import android.Manifest; import android. ...
- C#取绝对值函数
System.Math.Abs(float value); System.Math.Abs(decimal value); System.Math.Abs(int value); System.Mat ...
- Excel学习笔记:行列转换
目录 offset函数 行列转换的三种方式 1.右键转置 2.转置公式TRANSPOSE 3.引用函数OFFSET+ROWS/COLUMN(支持随时更新数据) 一行(列)转多行多列 offset函数 ...
- VSCode中Markdown目录显示异常
更新最新的VSCode之后编辑Markdown文件发现TOC标签的目录格式异常,发现是因为行尾字符导致,必须设置行尾字符进行解决.
- mybatis批量更新表setting parameters 错误
mybatis中想用 foreach标签 批量update set表 下面是mapper.xml <update id="updateMonitorById" paramet ...
- postgres 索引
索引是一种特殊的查询表,可以使用搜索引擎的数据库以加快数据检索.简单地说,索引是表中的数据的一个指针,在一个数据库中的索引是非常相似,如:一本书的目录. 例如,如果想在一本书中引用的所有页面讨论某个话 ...