bzoj 1517 [POI2006]Met 贪心
2024-10-20 20:59:02
[POI2006]Met
Time Limit: 15 Sec Memory Limit: 162 MB
Submit: 203 Solved: 108
[Submit][Status][Discuss]
Description
给出一棵N个结点的树,选择L条路径,覆盖这些路径上的结点,使得被覆盖到的结点数最多。
Input
第一行两个正整数N、L(2 <= N <= 1,000,000, 0 <= L <= N)。下面有N-1行,每行两个正整数A和B(1 <= A, B <= N),表示一条边(A,B)。
Output
一个整数,表示最多能覆盖到多少结点。
Sample Input
17 3
1 2
3 2
2 4
5 2
5 6
5 8
7 8
9 8
5 10
10 13
13 14
10 12
12 11
15 17
15 16
15 10
1 2
3 2
2 4
5 2
5 6
5 8
7 8
9 8
5 10
10 13
13 14
10 12
12 11
15 17
15 16
15 10
Sample Output
13
HINT
鸣谢Oimaster
Source
选择路径的代价相同显然考虑贪心。
首先我们可以按照拓扑关系把原图分层。
接下来我们考虑,对于每一层来说,我们显然最多选取2*l个点。
我们最终选的路径一定是l对叶子节点到另一个叶子节点异或是都选。
又每一个叶子节点一定由上一层的来,所以选叶子节点的话一定会覆盖其他层的点。
=-=噫
我知道我说的好乱。
结论是什么呢?
对于每一层来说,对答案的贡献是min(2*l,num[dep])
num[dep]代表第dep层的节点个数。
求和即可。
首先我们可以按照拓扑关系把原图分层。
接下来我们考虑,对于每一层来说,我们显然最多选取2*l个点。
我们最终选的路径一定是l对叶子节点到另一个叶子节点异或是都选。
又每一个叶子节点一定由上一层的来,所以选叶子节点的话一定会覆盖其他层的点。
=-=噫
我知道我说的好乱。
结论是什么呢?
对于每一层来说,对答案的贡献是min(2*l,num[dep])
num[dep]代表第dep层的节点个数。
求和即可。
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 1000100
using namespace std;
int head[N],cnt;
int n,l;
int in[N];
int dep[N];
int sum[N];
struct node
{
int from,to,next;
}edge[N<<];
void init()
{
memset(head,-,sizeof(head));
cnt=;
}
void edgeadd(int from,int to)
{
edge[cnt].from=from,edge[cnt].to=to,edge[cnt].next=head[from];
head[from]=cnt++;
}
void topsort()
{
queue<int>q;
for(int i=;i<=n;i++)
{
if(in[i]==)
dep[i]=,q.push(i),sum[]++;
}
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-;i=edge[i].next)
{
int to=edge[i].to;
in[to]--;
if(in[to]==)
{
dep[to]=dep[u]+;
sum[dep[to]]++;
q.push(to);
}
}
}
int ans=;
for(int i=;sum[i];i++)
{
ans+=min(sum[i],*l);
}
printf("%d\n",ans);
}
int main()
{
init();
scanf("%d%d",&n,&l);
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
edgeadd(x,y);
edgeadd(y,x);
in[x]++,in[y]++;
}
topsort();
}
最新文章
- ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?
- stm32 u8 u16 u32
- A book to recommend: The art of readable code
- Redis应用场景-转载
- C#的变迁史 - C# 5.0 之并行编程总结篇
- Redis命令大全&;中文解释&;在线测试命令工具&;在线中文文档
- c# word 转pdf 导出失败,因为此功能尚未安装
- 什么情况下include_path不起作用?
- OpenStack:初识
- vim不保存退出
- Android-day02_广播
- 怎么在后台修改前台html页面的key、title、description
- SpringMVC整合fastjson-1.1.41
- I/O输出端口照明LED
- 5. SQL Server数据库性能监控 - 当前请求
- 存储可靠性技术之 --RAID
- 移动Web学习笔记(第1天)-bootstrap框架的使用
- 挖一挖MongoDB的备份与还原(实现指定时间点还原和增量备份还原)
- windows下批量生成文件夹
- django 如何重写 HttpResponseRedirect 的响应状态码 302?
热门文章
- VC中编译出现error LNK2005:xx already defined in xxx.obj问题解决。
- POJ-2421-Constructing Roads(最小生成树 普利姆)
- SQL 公用表表达式(CTE)
- Python标准库--inspect
- ASCII码、HEX、字符、BCD 等等 基础知识思考
- dubbo心跳机制 (1)
- c++ constructor, copy constructor, operator =
- vuex模块相互调用
- fiddler抓包-简单易操作(二)
- Thymeleaf 使用时的标签