java实现长江游艇俱乐部在长江上设置了n个游艇出租站1,2,3…,n。游客可以在这些游艇出租站用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),1<=i<j=n。试设计一个算法,计算从游艇出租站1到出租站n所需的最少租金。输入描述:第一行表示有n个站点,接下来n-1行是r( i , j)。输出描述:输出从游艇出租站1到出租站3所需的最少租金样例输入: 请输入站数: 3 //站数 请输入从第一站到其他相应各站的租金: 5 15 //从第1站到其他相应各站的租金 请输入从第2站到其他相应各站的租金: 7 //从第2站到其他相应各站的租金样例输出: 最少租金为 12 元
时间: 2024-01-22 10:18:32 浏览: 85
租用游艇问题 长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1≤i<j≤n。试设计一个算法,计算出从游艇出租站1 到游艇出租站n 所需的最少租金。
5星 · 资源好评率100%
这是一个经典的最短路问题,可以使用Dijkstra算法或者Floyd算法解决。以下是使用Dijkstra算法的Java代码实现:
```java
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入站数:");
int n = scanner.nextInt();
int[][] rent = new int[n][n];
for (int i = 0; i < n - 1; i++) {
System.out.printf("请输入从第%d站到其他相应各站的租金:", i + 1);
for (int j = i + 1; j < n; j++) {
rent[i][j] = scanner.nextInt();
rent[j][i] = rent[i][j]; // 因为是无向图,所以要对称赋值
}
}
int[] dist = new int[n];
boolean[] visited = new boolean[n];
Arrays.fill(dist, Integer.MAX_VALUE);
dist[0] = 0; // 从第一站开始
for (int i = 0; i < n; i++) {
int minDist = Integer.MAX_VALUE;
int minIndex = -1;
for (int j = 0; j < n; j++) {
if (!visited[j] && dist[j] < minDist) {
minDist = dist[j];
minIndex = j;
}
}
if (minIndex == -1) {
break; // 所有点都已经访问过了
}
visited[minIndex] = true;
for (int j = 0; j < n; j++) {
if (!visited[j] && rent[minIndex][j] > 0 && dist[minIndex] + rent[minIndex][j] < dist[j]) {
dist[j] = dist[minIndex] + rent[minIndex][j];
}
}
}
System.out.printf("最少租金为 %d 元", dist[n - 1]);
}
}
```
阅读全文