题目
有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。
现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。
思路
使用动态规划 将大问题分解成小问题 具体解题思路如下图
 {
// dp[i][j] 表示经过i次航班飞行 从起点得到j点的最小花费
// 因为最多经过k个中转点那么就相当于最多飞k+1次航班
int[][] dp=new int[k+2][n];
// 根据题目中给出的数据范围,最多搭乘航班的次数不超过101,每次航班花费不超过10的四次方 设置出的最大值
// 如果初始设置为整数的最大值 加法的时候会溢出
for(int i=0;i<k+2;i++){
Arrays.fill(dp[i],10000 * 101 + 1);
}
// 一次都不飞 那么起点到起点的最小花费就是0 起点到其他的最小花费就是无穷(因为是要求最小 所以初始化是最大值)
dp[0][src]=0;
// t=1 是因为不飞的时候的答案都已经知道了
for(int t=1;t<k+2;t++){
for(int z=0;z<flights.length;z++){
int v1=flights[z][0];
int v2=flights[z][1];
int cost=flights[z][2];
//dp[t-1][v1]+cost 的意思就是从起飞点经过t-1次飞到v1,再从v1飞到V2
dp[t][v2]=Math.min(dp[t][v2],dp[t-1][v1]+cost);
}
}
int max=10000 * 101 + 1;;
for(int t=1;t<k+2;t++){
max=Math.min(max,dp[t][dst]);
}
if(max==10000 * 101 + 1){
return -1;
}else{
return max;
}
}
}