分层图最短路
题目描述
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()
{