题目描述

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

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

输入格式

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

输出格式

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

输入 #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层,所以能够优化的路径也就至多只有k层,保证了选择k条路径的前提

有点 u ,v ,令第 j - 1 层的 u 到第 j 层的 v 连边,代价为 0 ,这样子就能够表示这条路径被优化,同时又消耗了一次免费机会

注意:因为是双向边,所以同时也要连一条反向边

第 j 层的 u ,v 同时也要连一条边,代价为 c ,令优化过的 u 能够在不优化的情况下到达 v

得到这个新的图之后,我们在上面跑一遍最短路,就能够得到正确结果

因为最短路已经利用所有的 k 次机会优化了整个过程

【代码】

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#define ll long long
using namespace std;
typedef pair<int, int> P;
const int MAXN = 110010;
const int MAXM = 4100010;
const ll  INF = (1ll << 62) - 1;
struct note
{int to;int nt;ll cost;
};
struct edge
{note arr[MAXM];int  st[MAXN];ll  dis[MAXN];int  top;int n, m, s, t,k;edge(){memset(st, -1, sizeof(st));memset(dis, -1, sizeof(dis));top = 0;}void read(){top = 0;scanf("%d%d%d", &n, &m, &k);scanf("%d%d", &s, &t);s++, t++;for (int i = 1; i <= m; i++){int u, v;ll c;scanf("%d%d%lld", &u, &v, &c);u++, v++;add(u, v, c);add(v, u, c);for (int j = 1; j <= k; j++){add(u+( j - 1 )*n, v + j*n, 0);add(v+( j - 1 )*n, u + j*n, 0);add(u + j * n, v + j * n, c);add(v + j * n, u + j * n, c);}}for (int i = 1; i <= k; ++i){add(t + (i - 1)*n, t + i * n,0);}t += k * n;n = n * (k+1)+1;}void add(int x, int y, ll c){top++; arr[top] = { y,st[x],c }; st[x] = top;}ll min_dis(){priority_queue<P,vector<P>,greater<P> > q;fill(dis+1, dis + n+1, INF);dis[s] = 0;q.push(P(0, s));while (!q.empty()){P p = q.top();q.pop();int v = p.second;if (dis[v] < p.first)    continue;for (int i = st[v]; i != -1; i = arr[i].nt){int to = arr[i].to;if (dis[to] > dis[v] + arr[i].cost){dis[to] = dis[v] + arr[i].cost;q.push(P(dis[to], to));}}}return dis[t];}
};
edge road;
int main()
{road.read();printf("%lld", road.min_dis());return 0;
}

View Code

转载于:https://www.cnblogs.com/rentu/p/11320650.html

【JLOI2011】飞行路线相关推荐

  1. P4568 [JLOI2011]飞行路线

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

  2. bzoj2763 [JLOI2011]飞行路线

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

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

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

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

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

  5. JLOI2011 飞行路线

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

  6. [JLOI2011]飞行路线

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

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

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

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

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

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

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

  10. bzoj 2763 [JLOI2011]飞行路线——分层图

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2763 分层图两种方法的练习. 1.把图分成k+1层,本层去上面一层的边免费.但空间时间都不算 ...

最新文章

  1. Oracle、SQL Server、MySQL分页方法
  2. linux对方开放端口,Linux 开放端口
  3. 【Android】将Xamarin For VS升级为4.0.1.145版
  4. 1.cocos2dx 3.2环境搭建
  5. angular 数字逗号分隔,如何在Angular 4中为数字管道指定区域设置千位分隔符
  6. python 百度百科 爬虫_python简单爬虫
  7. 常用技巧 —— 离散化
  8. 【推荐实践】58招聘推荐排序算法实战与探索
  9. 解决pycharm在ubuntu下搜狗输入法一直固定在左下角的问题
  10. android使用FFmpeg解码MP4中的音频并使用AudioTrack播放
  11. jenkins--master/slave模式---master是容器版---slave是非容器版
  12. Swift 可选(Optionals)类型
  13. vue模块单独封装html,在vue中怎么定义自定义组件?
  14. 三星 android驱动安装失败,三星安卓手机usb驱动安装教程
  15. 功率和能量换算公式、如何换算,W和J如何转换,power和energy转换
  16. ssl2334 铲雪车
  17. 4.(地图数据篇)nginx代理地图服务--离线部署地图服务
  18. 角频率、圆周频率、归一化频率的区别
  19. python爬虫中字符串开头b,u,r的含义
  20. 照片生成3D虚拟数字人,虚拟形象主播搭建(软件+教程)

热门文章

  1. 洛谷 1541 乌龟棋
  2. 38. Count and Say
  3. JS String类型整理
  4. 安装多个版本JDK相关问题
  5. 在Ubuntu/Fedora/CentOS中安装Gitblit
  6. 郁金香2013网授汇编逆向与外挂 [ 91课,全 ]
  7. [置顶] 深入浅出Javascript(三)创建自定义对象以及属性、方法
  8. 浅谈netbios及其相关内容
  9. 交换机定时自动备份配置文件的方法
  10. 路由器+摄像头:Netgear在国内怎么走?