题目:从A飞到B,最多停k次,如何找路线,价钱最便宜。
输入:flights = {{{1, 1000}, {2, 2000}}, {{2, 500}}, {{1, 500}}}
from = 0
to = 2
k = 1
解释:一共有三个机场,分别是0、1、2。
第0号机场有两趟航班:从0到1的价格是1000,从0到2的价格是2000
第1号机场有一趟航班:从1到2的价格是500
第2号机场有一趟航班:从2到1的价格是500
我们目标是从0号机场到2号机场,中间最多经停1次。
输出:1500
解释: 首先从0飞到1,价格1000;然后从1飞到2,价格500。
思路分析:是一道图的最短路径问题,采用dijkstra算法的思想。
代码实现:
#include<iostream>
#include<vector>
#include<queue>
#include<functional>
using namespace std;
struct Node {
int cost;
int city;
int stops; //还可以飞行的次数
bool operator>(const Node& n) const{ return cost > n.cost; }
};
int ScheduleFlights(vector<vector<vector<int> > >& flights, int from, int to, int k)
{
priority_queue<Node, vector<Node>, std::greater<Node> > pq;
Node tn = { 0,from,k + 1 };
pq.push(tn);
while (!pq.empty()) {
tn = pq.top(); pq.pop();
if (tn.city == to) {
return tn.cost;
}
if (tn.stops > 0) {
for (int i = 0; i < flights[tn.city].size(); ++i) {
Node node = { flights[tn.city][i][1]+tn.cost,flights[tn.city][i][0],tn.stops - 1 };
pq.push(node);
}
}
}
return -1;
}
int main()
{
vector<vector<vector<int> > > flights({ { {1,1000},{2,2000} }, {{2,500}}, {{1,500}} });
cout << ScheduleFlights(flights, 0, 2, 1) << endl;
return 0;
}
箴言录:
取之有度,用之有节,则常足。