分层图最短路

分层图最短路

题目传送门(飞行路线)

题目描述

Alice 和 Bob 现在要乘飞机旅行,他们选择了一家相对便宜的航空公司。该航空公司一共在n个城市设有业务,设这些城市分别标记为 0 到 n−1,一共有 m 种航线,每种航线连接两个城市,并且航线有一定的价格。

Alice 和 Bob 现在要从一个城市沿着航线到达另一个城市,途中可以进行转机。航空公司对他们这次旅行也推出优惠,他们可以免费在最多 k种航线上搭乘飞机。那么 Alice 和 Bob 这次出行最少花费多少?
输入格式

第一行三个整数 n,m,k 分别表示城市数,航线数和免费乘坐次数。

接下来一行两个整数 s,t,分别表示他们出行的起点城市编号和终点城市编号。

接下来 m 行,每行三个整数a,b,c,表示存在一种航线,能从城市 a 到达城市 b,或从城市 b 到达城市 a,价格为 c。
输出格式

输出一行一个整数,为最少花费。

输入 #1
5 6 1
0 4
0 1 5
1 2 5
2 3 5
3 4 5
2 3 3
0 2 100

输出 #1
8

分层图最短路是指在可以进行分层图的图上解决最短路问题。分层图:可以理解为有多个平行的图。
一般模型是:在一个正常的图上可以进行 k 次决策,对于每次决策,不影响图的结构,只影响目前的状态或代价。一般将决策前的状态和决策后的状态之间连接一条权值为决策代价的边,表示付出该代价后就可以转换状态了。

此时思路很简单:可以建k层的分层图,分层图可以理解成互相平行的图,每层内的图都是题目输入的那个图,相邻层之间的边权值都赋0,不相邻的层之间没有路,所以到达第k+1层时就走了k条权值为0的边(边和点的数量要算好)

在这里插入图片描述对于上面的数据:答案就是3,3+n,3+2n,中dis的最小值。

#include<bits/stdc++.h> 
#define INF 10000000

using namespace std;
typedef pair<int,int> piar;
const int maxn=2100010;
int ecnt=-1,n,m,k,s,t;
int head[maxn];
struct Edge
{
   
	int to,nxt,w;
}e[maxn];
int dis[maxn],ans,vis[maxn];

int read()
{
   
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值