负责任的导游
小红在一家旅游公司做导游。她当前的任务是带一些游客去著名的A景区游览。由于A景区的景点较多,且比较分散,一些景点之间修有双向道路,景区内开通了环保巴士在这些景点间运行。出于安全考虑,环保巴士行驶在不同的道路上都规定了自己的最大乘客数目。小红有一份包含景区景点间道路状况和环保巴士最大载客容量的地图。由于这次小红所带的团体较大,她无法用一辆巴士将全体团员带往目的地景点。虽然景点循环运行的环保巴士是免费的,但小红觉得团员分别上不同的巴士不易组织,容易拉下游客。作为一名负责任的导游,小红采用事先向景区运营管理处预订多台巴士并有偿付费的方式,一次性将乘客带到了目的地景点。
例如,在下面7个景点的地图中,边代表道路,每条边上的数字代表了这条道路上的环保巴士的最大载客量。如果小红要将99位团员从景点1 带到景点7,则至少需要预订4辆巴士,最佳路线是 1- 2 - 4 - 7。
图3 景区交通图
请编写程序,帮助小红找出将所有游客带到目的地景点,且预订巴士数最少的线路。
输入
输入包含若干组数据。每组数据的第一行有两个整数 N (N <= 20)和 R,分别表示景点的数量和道路的数量。接下来的R 行有 3 个整数(C1,C2,P),其中 C1 和 C2 为景点编号,P(P > 1) 是该道路上环保巴士的最大载客量。各景点编号为 1 ~ N 的连续整数。第 R + 1 行包含 3 个整数(S,D,T),分别表示出发景点、目的地景点的编号和游客的数量。N = R = 0 时输入结束。
输出
对于每组输入数据,按照样例格式先输出一行数据编号,接下来在单独的一行中输出最少的预订巴士数,再在单独的一行中输出线路情况。在每组数据的输出后打印一个空行。
样例输入
7 10
1 2 30
1 3 15
1 4 10
2 4 25
2 5 45
3 4 40
3 6 20
4 7 35
5 7 20
6 7 30
1 7 99
0 0
样例输出
Scenario #1
Minimum Number of Trips = 4
1 ---> 2 ---> 4 ---> 7
代码:
import java.sql.Array;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
public class t7 {
static int n;
static int m;
static int s;
static int end;
static boolean[] vis;
static int value;
static int min;
static int[] a1;
static int[] a2;
static int ii=0;
static int index=0;
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
for(int scen=1;n!=0 && m!=0;scen++){
int[][] arr=new int[n+1][n+1];
for(int i=0;i<m;i++){
int row=sc.nextInt();
int col=sc.nextInt();
arr[row][col]=sc.nextInt();
arr[col][row]=arr[row][col];
}
s=sc.nextInt();
end=sc.nextInt();
value=sc.nextInt();
vis=new boolean[n+1];
min=Integer.MAX_VALUE;
a1=new int[n+1];
a2=new int[n+1];
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(arr[i][j]!=0){
arr[i][j]=value/(arr[i][j]+1)+1;
}
}
}
dfs(arr,s,0);
System.out.println("Scenario #"+scen);
System.out.println("Minimum Number of Trips = "+min);
for(int i=0;i<ii;i++){
System.out.print(a2[i]);
if(i!=ii-1) System.out.print("-->");
}
}
}
public static void dfs(int[][] arr, int start, int max){
vis[start]=true;
a1[index++]=start;
if(start==end){
if(min>max){
min=max;
ii=0;
a2=new int[n+1];
for(int x:a1) if(x!=0) a2[ii++]=x;
}
}else{
for(int i=1;i<=n;i++){
if(arr[start][i]!=0 && !vis[i]){
if(max<arr[start][i]) max=arr[start][i];
dfs(arr,i,max);
}
}
}
a1[index--]=0;
vis[start]=false;
}
}