SGU 280.Trade centers(贪心)
SGU 280.Trade centers 解题报告
题意:
n(<=30000)个城市,(n-1)条道路,求最少需要选择多少个城市建造市场,使得所有城市到任意一个市场的距离不大于k。
Solution:
比较好的贪心题。实现起来也有一定技巧。
先以任意点为根,构造出一颗有根树。
首先比较容易想到的是从叶子节点向上寻找,如果只有一个距离为k的点,就把它选上。但是有多个呢?
于是思考更一般的做法,由于是树形结构,先考虑以x节点为根的子树。我们先假设f[x]代表离x节点向下的市场点的距离,这个值可以通过子树的f[]值得出。但是子树有多个f[]我们需要的是哪个呢?
先来考虑x的儿子p,假设f[p]<=k,那么p已经被覆盖,并可能覆盖到x和它的父节点和它的兄弟子树。假设f[p]>k,那么p需要在x或它的父亲中建造市场,要么其实他已经被它的兄弟子树覆盖。这个可以通过判断$max(f[p])+min(f[p])+2$是否小于等于2*k+1来判断。
如果x的子树全部被覆盖了,那么$f[x] = min(f[p])+1$,
如果没有,$f[x]=max(f[p])+1$,并且如果f[x]=2*k+1那么让x成为关键点。即令$f[x]=0$。
注意在根的时候,根节点无法向上,如果f[root]>k说明子树中有节点需要在根节点建造市场。
根据定义叶子节点k应该满足f[k]=k+1。
最后输出f[]为0的节点就行了。
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int INF = 31111;
vector<int> edge[INF], ans;
int f[INF];
int n, k, tol;
int dfs ( int x , int fa )
{
int dmax = -INF, dmin = INF, s = 0;
f[x] = k + 1;
for ( int i = 0; i < edge[x].size(); ++i ) {
int v = edge[x][i];
if ( v == fa ) continue;
++s;
dfs ( v , x );
dmin = min ( f[v], dmin );
dmax = max ( f[v], dmax );
}
if ( s ) {
if ( dmin + dmax + 2 <= 2 * k + 1 ) f[x] = dmin + 1;
else f[x] = dmax + 1;
}
if ( f[x] == 2 * k + 1 ) {
f[x] = 0;
++tol;
}
}
int main()
{
scanf ( "%d %d", &n, &k );
for ( int i = 2, x, y; i <= n; ++i ) {
scanf ( "%d %d", &x, &y );
edge[x].push_back ( y );
edge[y].push_back ( x );
}
dfs ( 1 , 0 );
if ( f[1] > k ) ++tol, f[1] = 0;
printf ( "%d\n", tol );
for ( int i = 1; i <= n; i++ )
if ( f[i] == 0 ) printf ( "%d\n", i );
}
/*
14 3
1 2
1 3
1 4
2 5
2 6
3 7
3 8
4 9
7 10
7 11
10 12
11 13
13 14
answer:
2
1
7
*/
SGU 280.Trade centers(贪心)的更多相关文章
- HDU1009_FatMouse' Trade【贪心】【水题】
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- [题解]hdu 1009 FatMouse' Trade(贪心基础题)
Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding th ...
- hdu 1009:FatMouse' Trade(贪心)
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- HDU 1009 FatMouse' Trade (贪心算法)
题意:就是老鼠要用猫粮换粮食,第i个房间一些东西,要用东西去换,可以不全换.问给定的猫粮最多能换多少粮食. 析:贪心算法.我们先算出来每个房间物品的平均价格是多少,肯定越低越好,并且如果能全换就全换, ...
- HDU1009:FatMouse' Trade(初探贪心,wait)
FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containi ...
- HDU——1009FatMouse' Trade(贪心+结构体+排序)
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 杭电 1009 FatMouse' Trade (贪心)
Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding th ...
- HDU 1009 FatMouse' Trade【贪心】
解题思路:一只老鼠共有m的猫粮,给出n个房间,每一间房间可以用f[i]的猫粮换取w[i]的豆,问老鼠最多能够获得豆的数量 sum 即每一间房间的豆的单价为v[i]=f[i]/w[i],要想买到最多的豆 ...
- HDU 1009 FatMouse' Trade (贪心)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1009 题目大意:肥鼠准备了 磅的猫粮,准备和看管仓库的猫交易,仓库里装有他最喜爱的食物 豆.仓库有 个 ...
随机推荐
- 一切皆WEB
所有应用都应该成为Web应用吗?当然不是.总有一些重要的例外,有些种类的软件跟网络也毫无关系.但是,这些是少数情况,是一些特殊应用.它们固然是重要的小生态环境,但不管怎么说,就只是“小生态”. 如果你 ...
- 【OpenCV学习笔记】之六 手写图像旋转函数---万丈高楼平地起
话说,平凡之处显真格,这一点也没错! 比如,对旋转图像进行双线性插值,很简单吧? 可,对我,折腾了大半天,也没有达到预期效果! 尤其是三个误区让我抓瞎好久: 1,坐标旋转公式. 这东西,要用 ...
- fckeditor的用法
1.下载解压文件 2.将解压后的文件放入webroot下 3.将js引入要使用fckeditor的页面 4.用ckeditor替换textarea <@e.textarea id="t ...
- spring事物传播机制 事物隔离级别
Spring事务类型详解: PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择. PROPAGATION_SUPPORTS--支持当前事务,如 ...
- CSS- 兼容样式记录
前面加* 或者_,不是CSS的正常写法,而是利用IE的解析BUG,从而实现所需要的效果.应尽量避免使用吧.* margin-left:32px; /*所有浏览器*/*margin-left:32px; ...
- java反射与代理模式
流程age: 饭前洗手----> 吃饭 --->饭后洗碗 //吃饭 public interface Dinner { //吃饭方法 public void haveDinner(); } ...
- PowerShell随笔2_分支 选择 循环 特殊变量
PowerShell特殊变量: PowerShell的特殊变量由系统自动创建.用户自定义的变量名称应该不和特殊变量相同. $^ :前一命令行的第一个标记 $$ :前一命令行的最后一个标记 $_ :表示 ...
- CentOS 修改IP地址, DNS, 网关
一.CentOS 修改IP地址 修改对应网卡的IP地址的配置文件# vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改以下内容DEVICE=eth0 #描述 ...
- oncopy和onpaste
在Javascript中,有对应的事件能够监听复制和粘贴,那就是oncopy和onpaste. oncopy: demo: <body oncopy="alert('不能复制');re ...
- Windows下FFmpeg高速入门
本系列文章导航 Windows下FFmpeg高速入门 ffmpeg參数解释 mencoder和ffmpeg參数具体解释(Java处理视频) Java 生成视频缩略图(ffmpeg) 使用ffmpeg进 ...