JAVA算法练习(8):大臣的旅行

------文章底部代码分享

 一、题目

标题:大臣的旅费

很久以前, T 王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。

为节省经费, T 国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。
同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。

J 是 T 国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了 J 最常做的事情。
他有一个钱袋,用于存放往来城市间的路费。
聪明的 J 发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,
在走第 x 千米到第 x+1 千米这一千中他花费的路费是x+10这么多。
也就是说走1千米花费 11 ,走2千米要花费 23 。

J大臣想知道:他从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢?|

输入格式:
输入的第一行包含一个整数n,表示包括首都在内的 T 王国的城市数
城市从 1 开始依次编号, 1 号城市为首都。
接下来 n-1 行,描述 T 国的高速路      ( T 国的高速路一定是 n-1 条)
每行三个整数Pi, Qi , Di ,表示城市 Pi 和城市 Qi 之间有一条高速路,长度为 Di 千米。

输出格式:
输出一个整数,表示大臣J最多花费的路费是多少。
样例输人:
5
1 2 2
1 3 1
2 4 5
2 5 4

样例输出:
135

样例说明:
大臣 J 从城市 4 到城市 5 要花费 135 的路费

根据资源限制尽可能考虑支持更大的数据规模。

资源约定:
峰值内存消耗 < 64M
CPU 消耗 < 5000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入..”的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

二、解题

2.1

        第一步,读入城市数目;

 2.2

        创建一个类,存储两个数据一个用于判断该结点是否被访问过,一个存储邻接结点;

        创建类数组进行实例化;

        创建一个存储最大最大城市距离、一个最大路径长度的全局变量;

 2.3

        对数组进行输入数据;

 2.4

        建立一个深度优先遍历方法,利用 for 循环找到邻接结点,并利用之前在类内建立的布尔型变量进行避免重复访问同一个结点,方法使用完需要回溯;

 2.5

        当出现更长的路径时将它以及城市编号进行替换旧值;

 2.6

        调用两次 dfs 方法,第一次用于确定最长距离;

        最后输出金额;

        因为金额变化是 11 、12 、13 …………

        所以可以确定其为一个等差数列;

        又因为等差数列等于:(首项 + 尾项)* 项数 / 2;

        即可推得: (2 * 首项 + (长度 - 1)*差值)/ 2

 

三、代码分享

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;


class City {
    public boolean visited = false;
    public Map<Integer, Integer> nextCity = new HashMap<Integer,Integer>();

}

public class Main{
    public static int n = 0;
    public static City[] cities = null;
    public static int max = 0;
    public static int length = 0;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        cities = new City[n + 1];
        for (int i = 1; i <= n; i++)
            cities[i] = new City();
        
        
        for (int i = 0; i < n - 1; i++) {
            int begin = sc.nextInt();
            int over = sc.nextInt();
            int len = sc.nextInt();
            cities[begin].nextCity.put(over, len);
            cities[over].nextCity.put(begin, len);
        }

        dfs(1, 0);
        dfs(max,0);
        System.out.println( (11 + 11 + length - 1) * length / 2  );
    }
    public static void dfs(int begin, int len) {
        if ( len > length ) {
            length = len;
            max = begin;
        }
        cities[begin].visited = true;
        for (Map.Entry<Integer, Integer> city : cities[begin].nextCity.entrySet()) {
            if (!cities[city.getKey()].visited)
                dfs(city.getKey(), city.getValue() + len);
        }
        cities[begin].visited = false ;
    }
}

 

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jc_caterpillar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值