------文章底部代码分享
一、题目
标题:大臣的旅费
很久以前, 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 ;
}
}