高频算法面试题学习总结----图形结构3:安排航班

题目:从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;
}

 

箴言录:

取之有度,用之有节,则常足。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值