P4568 [JLOI2011]飞行路线

Description

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

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

Input

  • 数据的第一行有三个整数,n,m,k,分别表示城市数,航线数和免费乘坐次数。
    第二行有两个整数,s,t,分别表示他们出行的起点城市编号和终点城市编号。
    接下来有m行,每行三个整数,a,b,c,表示存在一种航线,能从城市a到达城市b,或从城市b到达城市a,价格为c。

Output

  • 只有一行,包含一个整数,为最少花费。

Sample Input

5 6 1
0 4
0 1 5
1 2 5
2 3 5
3 4 5
2 3 3
0 2 100

Sample Output

8

Data Size

  • 对于100%的数据,2≤n≤10000,1≤m≤50000,0≤k≤10,0≤s,t<n,0≤a,b<n,a≠b,0≤c≤1000

题解:

  • 分层图最短路。
  • 观察数据范围,k特别小(<=10)。所以可以用拆点的思想,就是把一个点拆成k种情况:用1次机会到达的、用2次机会到达的...用k次机会到达的。这样所有的状态就变成了一个大图。在这个大图上面跑最短路即可。
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#define N 100005
#define M 1000005
using namespace std;struct Node
{int val, pos;friend bool operator < (Node x, Node y) {return x.val > y.val;}
};
struct E {int next, to, dis;} e[M];
int n, m, k, s, t, num, ans = 0x7fffffff;
int h[N], dis[N];
bool vis[N]; int read()
{int x = 0; char c = getchar();while(c < '0' || c > '9') c = getchar();while(c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}return x;
}void add(int u, int v, int w)
{e[++num].next = h[u];e[num].to = v;e[num].dis = w;h[u] = num;
}void dijskra()
{memset(dis, 0x3f, sizeof(dis));priority_queue<Node> que;dis[s] = 0, que.push((Node){0, s});while(!que.empty()){int x = que.top().pos;  que.pop();if(vis[x]) continue;vis[x] = 1;for(int i = h[x]; i != 0; i = e[i].next)if(dis[x] + e[i].dis < dis[e[i].to]){dis[e[i].to] = dis[x] + e[i].dis;if(!vis[e[i].to]) que.push((Node){dis[e[i].to], e[i].to});}}
}int main()
{cin >> n >> m >> k >> s >> t;s++, t++;for(int i = 1; i <= m; i++){int u = read() + 1, v = read() + 1, w = read();add(u, v, w), add(v, u, w);for(int j = 1; j <= k; j++){add(u + j * n, v + j * n, w);add(v + j * n, u + j * n, w);add(u + (j - 1) * n, v + j * n, 0);add(v + (j - 1) * n, u + j * n, 0);}}dijskra();for(int i = 0; i <= k; i++)ans = min(ans, dis[t + i * n]);cout << ans; return 0;
}

转载于:https://www.cnblogs.com/BigYellowDog/p/11216971.html

P4568 [JLOI2011]飞行路线相关推荐

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

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

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

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

  3. P4568 [JLOI2011]飞行路线 P2939 [USACO09FEB]改造路Revamping Trails

    分层图最短路系列题目 分层图最短路的题目有一个非常容易看得出的把戏:让k条边免费. 对于能让\(k\)条边免费的数据,我们开\(k+1\)层图.每一层图内部正常连点,不同的是前一层的图的起点连一条权值 ...

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

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

  5. bzoj2763 [JLOI2011]飞行路线

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3216  Solved: 1230 [Submit][St ...

  6. luoguP4568 [JLOI2011]飞行路线

    https://www.luogu.org/problemnew/show/P4568 题目中 k 的大小只有 10,我们可以考虑建立分层图跑最短路 相同层中 a -> b 的权值仍为 val, ...

  7. JLOI2011 飞行路线

    洛谷 BZOJ 分析 经典的分层最短路题(我不会). 建 \(k+1\) 层图,跑一遍最短路,找到 \(dis[i]\) 最小的一个. 代码 #include <queue> #inclu ...

  8. [JLOI2011]飞行路线

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

  9. 洛谷 4568 [JLOI2011] 飞行路线

    题目戳这里 一句话题意: 有n个点,m条边的有向图,最多可以把k条边变为0,求从起点到终点最短距离. Solution 首先看到这题目,感觉贼难,看起来像DP,貌似也有大佬这么做,但鉴于本蒟蒻思维能力 ...

最新文章

  1. android studio下NDK开发
  2. CobaltStrike的使用
  3. 管理服务器一般的作用,管理服务器作用
  4. 什么是 Time to live TTL
  5. 对OIM Web(UI)层进行压力测试
  6. jquery.dataTables.min.js:62 Uncaught TypeError: Cannot read property ‘style‘ of undefined原因
  7. 技术动态 | 知识图谱从哪里来:实体关系抽取的现状与未来
  8. C/C++函数学习(6)容器分类
  9. SPOJ AMR12B 720
  10. Python 3 - 如何下载视图和保存证书
  11. 基于JAVA+Servlet+JSP+MYSQL的读者荐购系统
  12. PMP课程笔记:第6章 项目进度管理
  13. 华硕路由器无线打印服务器怎么开启,华硕ASUS路由器无线中继模式设置教程
  14. c++ 的interface
  15. 国内域名转入到AWS-Route53的操作实践经验分享
  16. Caporali HSK63A.H80.WE16
  17. 争对让望对思野葛对山栀注解_争对让,望对思的下一句是什么?
  18. 特征选择(一)-维数问题与类内距离
  19. L19-python核心编程-面向对象编程(day1、2)
  20. 不能用来修饰interface的有

热门文章

  1. Be a person
  2. Solution 24: 链表翻转
  3. 实现一个基于 SharePoint 2013 的 Timecard 应用(下)
  4. C++排序算法实现(更新中)
  5. 《OpenCV3编程入门》学习笔记7 图像变换(四 )仿射变换
  6. 网页如何与mysql服务器建立连接不上,html与mysql建立连接数据库
  7. 处理字典值是把字典放内存还是用sql处理_SQL索引及其底层实现
  8. 判定设备_盐雾腐蚀试验判定标准
  9. rn php,rn怎样在PHP的正则表达式中匹配到?
  10. c语言正数与负数相加_C语言数据基本类型(1)