[POJ2054]Color a Tree (并查集+贪心)

POJ终于修好啦
题意
和UVA1205是同一题,在洛谷上是紫题
有一棵树,需要给其所有节点染色,每个点染色所需的时间是一样的都是11.给每个点染色,还有一个开销“当前时间×ci×ci”,cici是每个节点的一个权值。(当前时间是染完这个节点的时间) 染色还有另一个约束条件,要染一个点必须要先染好其父节点,所以第一个染的点是根节点. 求最小开销。
思路
这道题显然对于 每一个可选的子节点选最重的 的贪心思路是错误的
就有点类似动态规划了 不过不DP也是可以贪心出来的。但是这个策略比较麻烦。大致思路就是父节点和子节点经过一些操作合并,合并之后贪心就是没问题的了。
不过我一开始自己的思路就是类似并查集+贪心的,不是合并(虽然差不多),就是全局贪心,把所有的点的权值排序,然后最大到最小的所有点慢慢并查集搜回去,直到所有点被处理过,也应该是可以的吧?但是时间复杂度肯定不行,于是就看李煜东的代码了(颓)。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; #define N 1005 int n, r;
double c[N];
int nxt[N], la[N], num[N],fa[N];
double d[N],tot[N];
bool vis[N]; void color_a_tree()
{
for (int i = ; i <= n; i++)
{
scanf("%lf", &c[i]);
nxt[i] = i; la[i] = i; num[i] = ; tot[i] = c[i];
}
memcpy(d, c, sizeof(d));
for (int i = , a, b; i < n; i++)scanf("%d%d", &a, &b), fa[b] = a;
memset(vis, , sizeof(vis));
for (int i = ; i < n; i++)
{
int p;
double k = ;
for(int j=;j<=n;j++)
if (j != r && !vis[j] && c[j] > k)
{
k = c[j];
p = j;
}
int f = fa[p];
while (vis[f]) fa[p] = f = fa[f];//getfather
nxt[la[f]] = p;
la[f] = la[p];
num[f] += num[p];
tot[f] += tot[p];
c[f] = tot[f] / num[f];
vis[p] = ;
}
int ans = ;
for (int i = ; i <= n; i++)
{
ans += i * d[r];
r = nxt[r];
}
printf("%d\n", ans);
} int main()
{
while (scanf("%d%d", &n, &r) == && n && r) color_a_tree();
return ;
}
[POJ2054]Color a Tree (并查集+贪心)的更多相关文章
- HDU 1598 find the most comfortable road 并查集+贪心
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1598 find the most comfortable road Time Limit: 1000 ...
- Hdu.1325.Is It A Tree?(并查集)
Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- POJ 1456 Supermarket 区间问题并查集||贪心
F - Supermarket Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Sub ...
- Is It A Tree?(并查集)
Is It A Tree? Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 26002 Accepted: 8879 De ...
- CF109 C. Lucky Tree 并查集
Petya loves lucky numbers. We all know that lucky numbers are the positive integers whose decimal re ...
- HDU 5606 tree 并查集
tree 把每条边权是1的边断开,发现每个点离他最近的点个数就是他所在的连通块大小. 开一个并查集,每次读到边权是0的边就合并.最后Ansi=size[findset(i)],size表示每个并 ...
- [Swust OJ 856]--Huge Tree(并查集)
题目链接:http://acm.swust.edu.cn/problem/856/ Time limit(ms): 1000 Memory limit(kb): 10000 Description T ...
- Codeforces Round #363 (Div. 2)D. Fix a Tree(并查集)
D. Fix a Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- Is It A Tree?(并查集)(dfs也可以解决)
Is It A Tree? Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submi ...
随机推荐
- 网页三剑客之HTML
Web服务本质 import socket def handle_request(client): request_data = client.recv(1024) print(request_dat ...
- DirectX11 With Windows SDK--16 流输出阶段
前言 在上一章,我们知道了如何使用几何着色器来重新组装图元,比如从一个三角形分裂成三个三角形.但是为了实现更高阶的分形,我们必须要从几何着色器拿到输出的顶点.这里我们可以使用可选的流输出阶段来拿到顶点 ...
- CSS盒模型(Box Model)
阅读目录 1. 什么是CSS盒模型 2. IE盒模型和W3C盒模型 3. CSS3属性box-sizing 4. 关于盒模型的使用 在最初接触CSS的时候,对于CSS盒模型的不了解,撞了很多次的南墙呀 ...
- Linux vi 编辑器常见命令的使用
Linux vi 编辑器常见命令的使用 Linux下的文本编辑器有很多种,vi 是最常用的,也是各版本Linux的标配.注意,vi 仅仅是一个文本编辑器,可以给字符着色,可以自动补全,但是不像 Win ...
- Java 线程安全LocalTime 和LocaldateTime 新的Date和Time类 -JDK8新时间类的简单使用
不可变类且线程安全 LocalDate .java.time.LocalTime 和LocaldateTime 新的Date和Time类 DateTimeFormatter ==https://ww ...
- WebService - [Debug] undefined element declaration 's:schema'
错误: [ERROR] undefined element declaration 's:schema' line 44 of http://www.webxml.com.cn/WebServices ...
- PHP 【五】
函数 如要在页面加载时执行脚本,可以把它放到函数里 函数是通过调用函数来执行的 可在页面的任何位置调用函数 <?phpfunction functionName(){ // 要执行的代码} ...
- easyui系列一 下拉框之组合框combobox
一.基础组合框 示例 <select class="easyui-combobox" name="state" style="width:200 ...
- JS中 typeof,instanceof类型检测方式
在js中的类型检测目前我所知道的是三种方式,分别有它们的应用场景: 1.typeof:主要用于检测基本类型. typeof undefined;//=> undefined typeof 'a' ...
- python学习之numpy.ewaxis
当多维数组的某一列时返回的是一个行向量 >>> X = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) >> ...