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 题目大意:肥鼠准备了 磅的猫粮,准备和看管仓库的猫交易,仓库里装有他最喜爱的食物 豆.仓库有 个 ...
随机推荐
- obj-c 名词
类: Class (description/template for an object)实例: Instance (manifestation of a class)消息: Message ...
- ssl error rx record too long
- RSS实例文档
<?xml version="1.0" encoding="ISO-8859-1" ?> <rss version="2.0&quo ...
- jetbrains
于最新jetbrains发布了IntelliJ IDEA 15. PyCharm 5.PhpStorm10.WebStorm 11等各个版本,但是改变了注册方法.原先的注册码包括注册机都已经不能使用了 ...
- myeclipse 写java代码提示 dead code 原因
经常使用MyEclipse要么Eclipse编辑写java程序猿代码.您可能经常会遇到一个黄色警戒线:dead code:一般程序猿遇到这些问题都会置之不理,反正也不影响程序的编译运行.对,这不是bu ...
- 读书笔记-详解C程序开发中 .c和.h文件的区别
一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定 ...
- 详解ExplosionField的使用,实现View的粉碎效果
小米平板卸载软件的时候,会有一个粉碎的效果,看起来很拉风,GitHub上有一个开源控件可以实现这个效果,我们一起来看看.先来看看效果图: 看起来不错吧,那我们今天就来详细说说ExplosionFiel ...
- frameset和iframe--框架对象及元素标签对象
chrome不兼容:不支持跨frame的变量的获取 var oParent = parent.document.getElementById('contentFrm'); //frameset标签对象 ...
- 关于FPGA异步时钟采样--结绳法的点点滴滴
一.典型方法 典型方法即双锁存器法,第一个锁存器可能出现亚稳态,但是第二个锁存器出现亚稳态的几率已经降到非常小,双锁存器虽然不能完全根除亚稳态的出现(事实上所有电路都无法根除,只能尽可能降低亚稳态的出 ...
- 骑士飞行棋 C#代码详解
最近看见一个骑士飞行棋的小游戏代码,感觉这个代码中将大多数C#的基础知识都运用到了,是一个新手检验学习成果的有效方法,特此将这个代码整理一遍.这是一个控制台程序.这是代码下载地址,代码中的注释非常详细 ...