Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >最优树遍历算法Topcoder

最优树遍历算法Topcoder
EN

Code Review用户
提问于 2016-01-15 04:40:29
回答 1查看 244关注 0票数 3

我正在topcoder.com舞台上练习一个1000点的算法问题。

问题如下:

你在一家电力公司工作,在一个相当大的公寓里停电,那里有很多愤怒的房客。你把问题隔离到复杂建筑下面的下水道网络中,在管道迷宫的每一个交界处都有一个升级变压器。在恢复电源之前,必须检查每台变压器是否正常运行,必要时予以固定。更糟糕的是,下水道被布置成一棵树,树根位于下水道网络的入口处。这意味着,为了从一个变压器到下一个变压器,将有许多回溯通过长期和幽闭恐惧症的管道,因为没有捷径之间的连接。此外,这是一个星期天,你只有一个值班的技术人员在下水道网络中搜索坏的变压器。你的主管想知道你有多快才能恢复供电;他太不耐烦了,他想在技术员接上最后一台变压器的那一刻就恢复供电,甚至不用等技术员先离开下水道。

您将得到三个int[]'s: fromJunction,toJunction,和ductLength,代表每个下水道管道。导管I在连接处(fromJunction我)开始,并通向连接处(toJunction我)。导管长度我表示技术人员穿过连接fromJunction我和toJunction我的管道所需的分钟数。考虑一下您的技术员检查/修理变压器所需的时间是瞬间的。你的技术人员将从0路口开始,这是下水道系统的根部。你的目标是计算出你的技术员检查所有变压器所需的最少分钟数。您将返回一个int,它表示这个最小分钟数。

约束:

  • fromJunction将包含1到50个元素(含)。
  • toJunction将包含1到50个元素(含)。
  • ductLength将包含1到50个元素(含)。
  • toJunction、fromJunction和ductLength都必须包含相同数量的元素。
  • fromJunction的每个元素都包含在0到49之间。
  • toJunction的每个元素都包含在1到49之间。
  • 对于i的所有有效值,fromJunction我将小于toJunction我。
  • 对于i的所有有效值,每个(fromJunction我,toJunction我)对都是唯一的。
  • 导管长度的每一个元素都包含在1到2000000之间。
  • 由边缘集(fromJunction我,toJunction我)表示的图永远不会包含循环,所有的连接都可以从连接0到达。

示例测试用例:

通过测试

{0,0,0,1,4}

{1,3,4,2,5}

{10,10,100,10

返回:165个

{0,0,0,0,1,4,6,7,7,20}

{1,3,4,2,5,6,7,20,9,10,31}

{10,10 100,10,5,1,100,1,1,5}

返回: 281

{0、0、1、1、1、3、1、4、7、2、0、3、6、8、5、11、3、12、0、15、15、18、0、4、7、24、25、10、0、19、25、6、15、29、20、5、23、19}

{1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、21、22、23、24、25、26、27、28、29、30、31、32、33、34、35、36、37、38}

{178317、81669、294672、1649827、671297、443274、1823848、333826、1750416、289900、1922826、1961031、1984157、1022042、1708788、952091、1095097、1600638、1896461、288397、741380、540242、1094958、60081、950467、1955292、1607609、1717760、1318832、242398、1586217、1374294、1231329、1969383、562578、962458、1114049、313948}

返回: 78008798

通过测试

{0、0、0、0、1、0、3、2、6、4、0、2、11、3、1、14、3、2、5、15、6、0、11、8、11、24、23、6、22、2、15、20、4、22、30、14、5、9、7、7、36、15、34、3、2}

{1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、21、22、23、24、25、26、27、28、29、30、31、32、33、34、35、36、37、38、39、40、41、42、43、44、45}

{752846、1419859、179904、163605、1740377、190846、1352634、965272、824872、538518、1438990、714089、1749318、238531、429771、1075929、996791、634327、687236、1567508、1123950、68018、1617650、191391、571448、1348412、164008、205801、1063191、1117957、1692178、1234376、1504523、1015591、1828379、1224921、1545579、37373、14625、379669、18141、18986、2586、764261717177、1763191、1117957、1692178、1234376、1504523、1015591、1828379、1224921、1545579、37373、14625、379669、18141、18986、2586、76428281717177}{{752846、1419859、179904、163605、1740377、190846、1352634、965272、824872、538518、1438990、714089、1749318、238531、429771、1015591、1828379、1224921、1545579、37373、14625、379669、18141、18986、764282177}

预期: 83927521

收到: 83927521

代码:

代码语言:javascript
运行
AI代码解释
复制
import java.util.*;


public class PowerOutage {

 public int estimateTimeOut(int[] fromJunction, int[] toJunction, int[] ductLength) {

    int res = 0, len = fromJunction.length;
    for (int i = 0; i < len; i++) {

        res += ductLength[i] * 2;
    }

    return res - mostExpensivePath(fromJunction, toJunction, ductLength, 0);
}

public boolean count(int[] a, int node) {
    for (int i = 0; i < a.length; i++) {

        if (a[i] == node)
            return false;
    }
    return true;
}
//Depth First Search
public int mostExpensivePath(int[] a, int[] b, int[] c, int currentRoot) {
    int cost = 0, maxC = 0, k = a.length, tempC = 0;

    while (!done(c)) {
        //find first deepest leaf node
        for (int i = 0; i < k; i++) {

            if (a[i] == currentRoot) {
                currentRoot = b[i];
                cost += c[i];
                i = -1;
            }

        }
        //trace leaf node back to the first multi-node parent
        for (int i = 0; i < k; i++) {
            if (b[i] == currentRoot) {
                currentRoot = a[i];
                a[i] = -1;
                b[i] = -1;
                tempC += c[i];
                c[i] = 0;
                i = -1;
                if (!count(a, currentRoot))
                    break;
            }
        }
        //check cost is max
        if (cost > maxC)
            maxC = cost;
        cost -= tempC;
        tempC = 0;
    }
    return maxC;
}

public boolean done(int[] c) {
    for (int i = 0; i < c.length; i++) {
        if (c[i] > 0)
            return false;
    }
    return true;
}

代码运行良好,并通过了所有测试用例。有什么办法让我改进吗?

EN

回答 1

Code Review用户

发布于 2016-01-20 01:43:32

更简单(但在某些情况下非常慢)函数计算最长路径的成本:

代码语言:javascript
运行
AI代码解释
复制
public int largestPathCost(int[] a, int[] b, int[] c) {
    int k = a.length;

    // prepare array of costs (times) to reach each node

    int cost[] = new int[k+1];
    for (int i = 0; i <= k; i++)
        cost[i] = 0;

    // calculate times by adding duct lengths

    for (int toGo = k; toGo != 0;) {       // nodes to calculate
        for (int i = 0; i < k; i++) {      // test the i-th duct
            int fromId = a[i];
            int toId = b[i];               // endpoint

            if (cost[toId] == 0)           // not calculated yet
                if (fromId == 0 || cost[fromId] != 0) {
                    cost[toId] = cost[fromId] + c[i];
                    toGo --;
                }
        }
    }

    // retrieve the maximum cost

    int maxC = 0;
    for (int i = 1; i <= k; i++) {
        if (cost[i] > maxC)
            maxC = cost[i];
    }

    return maxC;
}

如果管道是以相反的顺序(最远的第一个)提供的话,它可能会非常慢。最糟糕的情况是单程“迷宫”,长链的管道没有叉子,管道按“向后”的顺序排列。这将导致k迭代k-item数组,从而导致O(k^2)的总时间开销。

为了避免最坏的情况,您可以在分析之前增加toJunction[]值来对这三个输入数组进行排序。然后将实际分析简化为一次通过k-item数组,因此需要线性时间O(k)。加上排序的时间,总复杂度为O(k log )。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/116873

复制
相关文章
iOS动画-CALayer隐式动画原理与特性
Core Animation的一个非常显著的特性是就是实现动画,而且它支持隐式动画和显式动画两种形式,本篇我们主要从隐式动画说起;
梧雨北辰
2019/04/25
4.7K0
iOS动画-CALayer隐式动画原理与特性
iOS动画-CALayer基础知识
核心动画Core Animation,其实是由Layer Kit这样一个名字演变而来。它实际上是一个复合引擎,可以将存储在图层树体系中的不同独立图层,尽可能快地组合成不同的可视内容呈现于屏幕上;所以做动画只是Core Animation的特性之一;
梧雨北辰
2019/04/22
1.9K0
iOS动画-CALayer基础知识
iOS动画系列之一:带时分秒指针的时钟动画(上)1. 最终实现的效果以及思维导图2. CALayer3. 隐式动画
1. 最终实现的效果以及思维导图 实现的效果。不小心暴露了写文章的时间。-_-+++ 实现效果 实现的步骤思维导图: 思维导图.png 2. CALayer 其实今天分享的主角是CALayer。因为所
stanbai
2018/06/28
2.1K0
【Flutter 专题】71 图解基本隐式动画 Widget
和尚前段时间自定义 ACEStepper 步进器时,在 ACEStep 中尝试过 AnimatedCrossFade 用于在两个 Widget 切换过度,简单实用,今天和尚重点学习一下并尝试相关隐式动画 Widget;
阿策小和尚
2019/12/30
8260
【Flutter 专题】71 图解基本隐式动画 Widget
php隐式转换,隐式转换如何使用?总结隐式转换实例用法「建议收藏」
JavaScript的数据类型分为六种,分别为null,undefined,boolean,string,number,object。object是引用类型,其它的五种是基本类型或者是原始类型。我们可以用typeof方法打印来某个是属于哪个类型的。不同类型的变量比较要先转类型,叫做类型转换,类型转换也叫隐式转换。隐式转换通常发生在运算符加减乘除,等于,还有小于,大于等。。typeof ’11’ //string
全栈程序员站长
2022/11/10
1.7K0
php隐式转换,隐式转换如何使用?总结隐式转换实例用法「建议收藏」
iOS-核心动画详解之CALayer
1. CALayer的基本操作. 1. CALayer简介: CALayer我们又称为层,在每个UIView内部都有一个layer的属性,UIView之所以能够显示,就是因为它里面有layer层,才具有显示的功能,我们通过操作CALayer对象,可以很方便地调整UIView的一些外观属性,例如可以给UIView设置阴影,圆角,边框等等... 2. 操作layer改变UIView外观. 2.1 设置阴影 //默认图层是有阴影的, 只不过是透明的。1为不透明,0为透明 _RedView.layer.sha
xx_Cc
2018/05/10
2K0
如何找到隐式转换的SQL?
我们知道,隐式转换是在开发过程中非常容易进的一种坑,最常见的就是程序中传参类型和数据库表中定义的字段类型不一致,隐患就是不能用到隐式转换字段上的索引,原先能使用索引的语句,却使用了全表,影响执行性能。
bisal
2021/09/06
1.1K0
position和anchorPoint
本人录制技术视频地址: https://edu.csdn.net/lecturer/1899 欢迎观看。 一、理论概述
全栈程序员站长
2022/11/08
5400
如何实现隐式类型转换
Result 类型是许多编程语言中处理错误的常用方式,包括 C# 的 dotNext 库。在本文中,我们将通过例子回顾 C# 中 using 语句和隐式类型转换的使用。
newbe36524
2023/08/23
1840
Core Animation总结
众所周知,绚丽动画效果是iOS系统的一大特点,通过UIView层封装的动画,基本可以满足我们应用开发的所有需求,但若需要更加自由的控制动画的展示,我们就需要使用CoreAnimation框架中的一些类与方法
iOSSir
2019/05/21
1.3K0
iOS动画-CALayer布局属性详解
本篇主要内容: 1.Frame与Bounds的区别 2.中心点(position)与锚点(anchorPoint) 3.视图与图层的坐标系
梧雨北辰
2019/04/23
2.3K0
iOS动画-CALayer布局属性详解
mysql 隐式类型转换_scala的隐式转换
在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引。下面分析两种隐式转换的情况
全栈程序员站长
2022/11/07
1.9K0
mysql 隐式类型转换_scala的隐式转换
iOS面试题:UIView block动画实现原理
在了解UIView block动画实现原理之前,需要先了解CALayer的可动画属性。
猿_人类
2019/07/03
1.1K0
iOS面试题:UIView block动画实现原理
Amesp中隐式溶剂模型的使用
在量子化学计算中,往往需要计算分子在溶液中的性质,这就需要使用到溶剂模型,其主要分为显式溶剂模型和隐式溶剂模型。显式溶剂模型是将具体的溶剂分子排布在溶质分子周围进行计算,耗时较高。而隐式溶剂模型不需要具体的溶剂分子以及其排布方式,只是将溶剂简单地使用一个可极化的连续介质来描述,这种方式耗时不高,且能很容易表现出溶剂的平均效应,因此被大多数量子化学软件广泛采用。
用户7592569
2023/09/03
5320
Amesp中隐式溶剂模型的使用
javascript 隐式转换_mysql隐式转换
简单数据类型(也称为原始类型):Undefined、Null、Boolean、Number、String 和 Symbol。ES6 中新增了一种 Symbol 。这种类型的对象永不相等,即始创建的时候传入相同的值,可以解决属性名冲突的问题,做为标记。 复杂数据类型叫 Object(对象)。Object 是一种无序名值对的集合。
全栈程序员站长
2022/11/07
1.6K0
javascript 隐式转换_mysql隐式转换
MySQL中需要重视的隐式转换
在系统集成,对接的过程中,很多时候我们都会忽略数据类型的兼容性,导致在系统运转起来的时候,原本正常的流程会容易堵塞,其中一个潜在的原因就是因为数据隐式转换带来的额外代价,为了模拟这个问题,我们使用如下的方式创建表 test,分别指定列name为varchar和int类型,来对比查看隐式转换带来的性能问题。
jeanron100
2019/06/04
1K0
iOS学习——核心动画之Layer基础
CALayer我们又称它叫做层。在每个UIView内部都有一个layer这样一个属性,UIView之所以能够显示,就是因为它里面有这个layer才具有显示的功能。我们可以通过操作CALayer对象,可以很方便地调整UIView的一些外观属性,可以给UIView设置阴影,圆角,边框等等...
mukekeheart
2018/08/01
1.6K0
iOS学习——核心动画之Layer基础
隐式Intent
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(“com.example.shaomiao.testintent.intent.action.TestActivity”); startActivity(intent); } });
tea9
2022/07/15
5330
隐式Intent
Scala 【 14 隐式转换与隐式参数 】
​ Scala 的隐式转换,其实最核心的就是定义隐式转换函数,即 implicit conversion function 。
Lokinli
2023/03/09
8280
JS隐式转换_隐式转换是什么
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/10
1.9K0

相似问题

如何使用Amazon更新DynamoDB全局辅助索引?

21

如何使用全局辅助索引创建表dynamodb

20

dynastyjs:如何使用辅助全局索引查找项目

112

如果分区键相同,DynamoDB本地辅助索引与全局辅助索引之间是否存在差异?

10

查询DynamoDb全局辅助索引

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文