| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 贪心--Color a Tree !!! -> 正文阅读 |
|
[数据结构与算法]贪心--Color a Tree !!! |
题目概述Bob对一棵树的数据结构非常感兴趣。树是一个有向图,其中一个特殊的节点被挑选出来,被称为树的“根”,并且从根到每个其他节点都有唯一的路径。 Bob打算用笔来着色树的所有节点。一棵树有n个节点,这些节点编号为1, 2,…,n。假设一个节点着色需要1个单位时间,并且在完成一个节点着色之后,允许他对另一个节点着色。另外,只有当父节点被着色时,才允许他对节点着色。显然,Bob只允许在第一次尝试中着色根。 每个节点都有一个“着色成本因子”,Ci。每个节点的着色成本取决于Ci和Bob完成该节点着色的时间。开始时,时间设置为0。如果着色节点i的完成时间是FI,则节点I的着色代价是Ci*Fi。 例如,在图1中示出了一个具有五个节点的树。每个节点的着色成本因子分别为1,2,1,2和4。Bob可以以1,3,5,2,4的顺序对树进行着色,最小总着色成本为33。
输入格式: 输入由几个测试数据组成。每一行的第一行包含两个整数 n 和 r (1<n<=1000, 1 <=r <=n),其中 n 是树中的节点数,r 是根节点的节点数。第二行包含 n 个整数,其中第 i 个是 Ci(1<Ci=500),节点 i 的着色代价因子 l 。每个下一个 N-1 行包含两个空间分离的节点编号 V1 和 V2 ,它们是树中的边的端点,表示 V1 是 V2 的父节点。 没有边将被列出两次,所有的边将被列出。 n=0 和 r=0 的测试样例表示输入的结束,不应该被处理。 输出格式: 对于每个测试样例,输出一个包含 Bob 所需的最小总着色代价的行,以对所有节点着色。 样例输入
样本输出
Color a Tree: 原题看这里 思路解析整体思路看到这道题,首先会出现一个错误的贪心思路----“每一步在可以被染色的点里选权值最大的染色”。这个思路的反例很容易给出----“构造一棵树,让一个权值很小的结点下面有很多权值巨大的结点,另一个权值较大的结点却没有子结点”。 等效权值 算法假如有权值为 x,y,z 的三个点,我们已知 x 和 y 的染色操作是连续的,那么就有两种可能的染色方案: 由此我们得到一种“等效权值”的算法: 代价和 算法我们可以把结点类比为在队列里等待的顾客。 以样例输入为例: 按照贪心原则首先选择5合并到3形成集合A={3,5}, Ans+=fact[5]*num[3]=4; 然后再按照贪心原则选择集合A合并到1形成集合B={1,3,5},fact[B]=6,num[B]=3; Ans+=fact[A]*num[1]=9; 然后再选择2合并到集合B形成集合C={1,2,3,5}, Ans+=fact[2]*num[B]=15; 最后选择4合并到集合C形成集合D={1,2,3,4,5}, Ans+=fact[4]*num[C]=23; 最后Ans+=fact[D]=33; 代码实现
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 5:29:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |