题目:

Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司。该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格。Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机。航空公司对他们这次旅行也推出优惠,他们可以免费在最多k种航线上搭乘飞机。那么Alice和Bob这次出行最少花费多少?

思路:

典型的分层图求最短路问题,这类问题一般适用于我们要对图中的某些边的权进行变换的情况,当然变换的次数要很小才行。

d[u][j]表示到达u点已经免费乘坐了j次航线的最短距离。在套一个裸的迪杰斯特拉算法就可以了。

代码:

  1. //#include <bits/stdc++.h>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <vector>
  6. #include <algorithm>
  7. #include <queue>
  8. #define MAX 1000000000
  9. #define inf 0x3f3f3f3f
  10. #define FRE() freopen("in.txt","r",stdin)
  11.  
  12. using namespace std;
  13. typedef long long ll;
  14. const int maxn = ;
  15. int n,m,k,s,t;
  16. int d[maxn][];
  17. struct Edge
  18. {
  19. int to,c;
  20. };
  21. vector<Edge> mp[maxn];
  22. struct Node
  23. {
  24. int u,k,d;
  25. bool operator<(const Node& rhs)const{
  26. return d>rhs.d;
  27. }
  28. };
  29.  
  30. void Dij()
  31. {
  32. for(int i=; i<=k; i++) d[s][i] = ;
  33. priority_queue<Node> que;
  34. que.push(Node{s,,});
  35. while(!que.empty())
  36. {
  37. Node u = que.top();
  38. que.pop();
  39. if(u.d>d[u.u][u.k]) continue;
  40. for(int i=; i<mp[u.u].size(); i++)
  41. {
  42. Edge e = mp[u.u][i];//可以将这里的分层图看做是dp来理解
  43. if(u.d+e.c<d[e.to][u.k])//不乘坐免费的情况
  44. {
  45. d[e.to][u.k] = u.d+e.c;
  46. que.push(Node{e.to,u.k,u.d+e.c});
  47. }
  48. if(u.k+<=k && d[e.to][u.k+]>d[u.u][u.k])//免费乘坐的情况
  49. {
  50. d[e.to][u.k+] = d[u.u][u.k];
  51. que.push(Node{e.to,u.k+,d[u.u][u.k]});
  52. }
  53. }
  54. }
  55. return ;
  56. }
  57.  
  58. int main()
  59. {
  60. //FRE();
  61. memset(d,inf,sizeof(d));
  62. scanf("%d%d%d",&n,&m,&k);
  63. scanf("%d%d",&s,&t);
  64. for(int i=; i<m; i++)
  65. {
  66. int u,v,c;
  67. scanf("%d%d%d",&u,&v,&c);
  68. mp[u].push_back(Edge{v,c});
  69. mp[v].push_back(Edge{u,c});
  70. }
  71. Dij();
  72. int ans = inf;
  73. for(int i=; i<=k; i++)
  74. {
  75. ans = min(ans,d[t][i]);
  76. }
  77. printf("%d\n",ans);
  78. return ;
  79. }

HYSBZ - 2763 飞行路线(分层图最短路线)的更多相关文章

  1. bzoj2763 [JLOI]飞行路线 分层图最短路

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

  2. bzoj2763 [JLOI2011]飞行路线——分层图

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2763 构建分层图. 代码如下: 写法1(空间略大)(时间很慢): #include<i ...

  3. P4568 飞行路线 分层图最短路

    P4568 飞行路线 分层图最短路 分层图最短路 问题模型 求最短路时,可有\(k\)次更改边权(减为0) 思路 在普通求\(Dijkstra\)基础上,\(dis[x][j]\)多开一维\(j\)以 ...

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

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

  5. bzoj2763: [JLOI2011]飞行路线(分层图spfa)

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3234  Solved: 1235[Submit][Stat ...

  6. [JLOI2011]飞行路线 分层图最短路

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

  7. [BZOJ2963][JLOI2011]飞行路线 分层图+spfa

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

  8. BZOJ2763: [JLOI2011]飞行路线(分层图 最短路)

    题意 题目链接 Sol 分层图+最短路 建\(k+1\)层图,对于边\((u, v, w)\),首先在本层内连边权为\(w\)的无向边,再各向下一层对应的节点连边权为\(0\)的有向边 如果是取最大最 ...

  9. 【bzoj2763】[JLOI2011]飞行路线 分层图最短路

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

随机推荐

  1. Windows NT/NTLM 加密

    Hash,一般翻译为“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是散 ...

  2. Ruby Time类和Date类

    Time类 更新: 2017/06/23 更新了Data/Time在model模式下的便利方法 更新: 2018/10/12 修改了%Y相关描述防止误解  年月日时分秒,时区    生成  获取当前时 ...

  3. idea 设置项目编码

    目前我了解的设置idea编码有两种形式(但深层次不太了解) 方式一: 这个方式需要你点击要设置编码单个文件,选择编码.一次只能修改一个文件编码 方式二: 一般工作时使用这个方式,文件编码,选择项目文件 ...

  4. 初窥MySQL性能调优

    本文涉及:MySQL自带的性能测试工具mysqlslap的使用及几个性能调优的方法 性能测试工具—mysqlslap mysqlslap是MySQL自带的一款非常优秀的性能测试工具.使用它可以 模拟多 ...

  5. C#模版学习研究

    原文链接1   原文链接2 using System; using System.Collections.Generic; using System.Text; using T = System.By ...

  6. http缓存之lastModified和etag

    1.cache-control 访问资源 首次访问页面时间:2018.2.1  9:56  (当前时间=GMT时间+8h) 缓存时长max-age:1 day Expire缓存失效时间:2018.2. ...

  7. IOS应用开发版本控制工具之Versions使用,iosversions

    Versions版本控制工具破解版(Versions.zip)下载请见本博文附件.下载后在MAC安装完以后,图标是莲花状.见下图: 双击运行如下图:    点击Repository,连接SVN服务器R ...

  8. oracle如何实现函数、包、存储过程加密

    首先创建一个名称为test1.sql的文件: CREATE OR REPLACE FUNCTION get_date_string RETURN VARCHAR2 AS BEGIN RETURN TO ...

  9. 189 Rotate Array 旋转数组

    将包含 n 个元素的数组向右旋转 k 步.例如,如果  n = 7 ,  k = 3,给定数组  [1,2,3,4,5,6,7]  ,向右旋转后的结果为 [5,6,7,1,2,3,4].注意:尽可能找 ...

  10. (四)SpringIoc之Bean装配

    在pom.xml的依赖 <dependencies> <!--测试包--> <dependency> <groupId>junit</groupI ...