题目描述

\(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

说明

对于\(30\%\)的数据,\(2 \le n \le 50,1 \le m \le 300,k=0\);
对于\(50\%\)的数据,\(2 \le n \le 600,1 \le m \le 6000,0 \le k \le 1\);
对于\(100\%\)的数据,\(2 \le n \le 10000,1 \le m \le 50000,0 \le k \le 10\)

\(2018.12.10\) 增加一组 \(hack\) 数据

思路:一个明显的分层最短路问题,就是建立\(n\)层图,然后建原图的映射边,每个点与它连向的点的映射点距离为\(0\),之后跑\(dijkstra\),因为\(k\)次免费机会可以不用完,所以从\(1\)到\(k\)取最大值就好了。

代码:

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cctype>
#define maxn 5000001
using namespace std;
int n,m,k,head[maxn],num,dis[maxn],s,t;
inline int qread() {char c=getchar();int num=0,f=1;for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) num=num*10+c-'0';return num*f;
}
struct Edge {int v,w,nxt;
}e[maxn];
struct node {int x,y;bool operator < (const node &a) const {return y>a.y;}
};
inline void ct(int u, int v, int w) {e[++num].v=v;e[num].w=w;e[num].nxt=head[u];head[u]=num;
}
priority_queue<node>q;
inline void dijkstra() {memset(dis,0x3f,sizeof(dis));dis[s+n*k]=0;q.push((node){s+n*k,0});while(!q.empty()) {int u=q.top().x,d=q.top().y;q.pop();if(d!=dis[u]) continue;for(int i=head[u];i;i=e[i].nxt) {int v=e[i].v;if(dis[v]>dis[u]+e[i].w) {dis[v]=dis[u]+e[i].w;q.push((node){v,dis[v]});} }}
}
int main() {n=qread(),m=qread(),k=qread(),s=qread(),t=qread();for(int i=1,u,v,w;i<=m;++i) {u=qread(),v=qread(),w=qread();for(int j=0;j<=k;++j) {ct(u+j*n,v+j*n,w);ct(v+j*n,u+j*n,w);if(j) {ct(u+j*n,v+(j-1)*n,0);ct(v+j*n,u+(j-1)*n,0);} }}dijkstra();int zrj=0x7fffffff;for(int i=0;i<=k;++i) zrj=min(zrj,dis[t+i*n]);printf("%d\n",zrj);return 0;
}

转载于:https://www.cnblogs.com/grcyh/p/10134338.html

洛谷P4568 飞行路线相关推荐

  1. 洛谷P4568 飞行路线 最短路k条免费

    题目链接:https://www.luogu.org/problem/P4568 不管是k条免费还是半价都可以做~~~ 两种方法: 1.分层建图(但这种方法建图复杂度有点大) 就是几条免费建层图,每一 ...

  2. 洛谷P4568 [JLOI2011] 飞行路线 题解

    洛谷P4568 [JLOI2011] 飞行路线 题解 题目链接:P4568 [JLOI2011] 飞行路线 题意: Alice 和 Bob 现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公 ...

  3. 洛谷 P4568 [JLOI2011] 飞行路线(分层图最短路)

    [JLOI2011] 飞行路线 题目描述 Alice 和 Bob 现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在 n n n 个城市设有业务,设这些城市分别标记为 0 0 0 到 ...

  4. 洛谷 - P4568 [JLOI2011]飞行路线(分层图最短路)

    题目链接:点击查看 题目大意:给出一张图,每条边都有权值,现在要求从点st到达点ed,沿途中可以让k条边的边权免费,现在求最短路 题目分析:分层图经典模板问题,直接套板子就行了,最后记得对于数组d的每 ...

  5. 最短路分层图专题 洛谷P2939,4822,4568

    2020.6.3 今天主要练习了下分层图.看洛谷题解每次都能有新收获.今天本来想练dp,后来感觉可能会太自闭了,不如先来一发最短路,毕竟看家本领不能忘.然后点进了北京某年wc的一道题,让求1-n的最短 ...

  6. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  7. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  8. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  9. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

  10. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

最新文章

  1. Android OpenCV 边缘检测 Canny 的使用
  2. 20181113-3 Beta阶段贡献分配规则
  3. 广度优先搜索 BFS算法
  4. Android中设置组件多进程
  5. C#中保存Gif文件设置透明无效果
  6. python:如何将字典值写入一个文本文件?
  7. Sparkmllib scala逻辑回归
  8. django-关闭调试模式-保护网站安全
  9. Java日志记录最佳实践
  10. 【Servlet笔记】Servlet入门
  11. python 数组学习
  12. 王者荣耀交流协会final发布-第一次scrum立会
  13. Memcached如何实现高性能批量删除
  14. 什么场景下声明式事务会失效?如何解决?
  15. java两周期的正选函数,在 Java 中如何计算双曲正弦,余弦和正切?
  16. 摄像机高精度标定的一些方法
  17. 人生苦短python作伴_人生苦短,我用python
  18. 锐捷密码忘了!-锐捷密码查看器
  19. 人人网发布QQ劝架补丁 同时兼容QQ及360
  20. 阿里测试工程师聊:软件测试需要学什么?

热门文章

  1. Kindle通过邮箱传文件允许的文件类型。
  2. java枚举类的作用及其使用
  3. JN5169 JN-AN-1217-Zigbee-3-0-Base-Device
  4. uefi下添加显卡驱动
  5. 值得收藏的网站----安全
  6. java天津与深圳,国内最可惜的城市:GDP曾是深圳的38倍,如今GDP被反超万亿!
  7. Linux 中防火墙命令
  8. [C]结构体数组初始化
  9. 【图形图像处理】之栅格化介绍
  10. Tiles的使用,遗漏和总结