蓝桥杯日常——大臣的旅费

博客围绕T国路费计算问题展开,描述了T国城市道路连接情况及路费计算规则,给出输入输出格式和样例。作者因深搜运用不熟练,采用基本矩阵搜索且未剪枝,挨个计算两点距离枚举最大旅费,通过了75%的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

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

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

J是T国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了J最常做的事情。他有一个钱袋,用于存放往来城市间的路费。

聪明的J发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,在走第x千米到第x+1千米这一千米中(x是整数),他花费的路费是x+10这么多。也就是说走1千米花费11,走2千米要花费23。

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

输入格式

输入的第一行包含一个整数n,表示包括首都在内的T王国的城市数

城市从1开始依次编号,1号城市为首都。

接下来n-1行,描述T国的高速路(T国的高速路一定是n-1条)

每行三个整数Pi, Qi, Di,表示城市Pi和城市Qi之间有一条高速路,长度为Di千米。

输出格式

输出一个整数,表示大臣J最多花费的路费是多少。

样例输入1

5
1 2 2
1 3 1
2 4 5
2 5 4

样例输出1

135

输出格式

大臣J从城市4到城市5要花费135的路费。

思路:本人对深搜运用不是很熟练,只能采用最基本的矩阵去搜索,且没有剪枝,实际上最好的思路是求出每个节点对应的距离最长的一对顶点,需要使用两次深搜,但因太菜不会写,只好挨个计算两个点之间的距离,然后枚举判断出最大旅费,最后过了75%的数据,代码如下:

import java.util.Scanner;
public class Main 
{   
	static int n;
	static int [][]v;
	static int []visit;
	static int [][]cost;
	public static int Sn(int n) {
		return n*10+(n*(1+n))/2;
	}
	public static void dis(int s,int x,int y) {
		if(x!=y) {
			for(int i=1;i<=n;i++) {
				if(i!=x&&v[x][i]==1&&visit[i]==0) {
					visit[i]=1;
					cost[s][i]=cost[s][x]+cost[x][i];
					dis(s,i,y);
					if(i==y)
						break;
				}
			}
		}
	}
	public static void initvisit() {
		for(int i=1;i<=n;i++)
			visit[i]=0;
	}
public static void main(String[] args) throws IOException{
	Scanner sc=new Scanner(System.in);
	n=sc.nextInt();
	v=new int[n+1][n+1];
	visit=new int[n+1];
	cost=new int[n+1][n+1];
	for(int i=1;i<n;i++) {
		int p=sc.nextInt();
		int q=sc.nextInt();
		int d=sc.nextInt();
		v[p][q]=1;
		v[q][p]=1;
		cost[p][q]=d;
		cost[q][p]=d;
	}
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=n;j++) {
			visit[i]=1;
			if(i!=j&&v[i][j]==0) {
				dis(i,i,j);
			}
			initvisit();
		}
	}
	int max=0;
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=n;j++) {
			if(cost[i][j]>max)
				max=cost[i][j];
		}
	}
	System.out.println(Sn(max));
}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值