题目描述

Link

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

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

分层图最短路的模板题。

发现自己好久不打,都快忘了怎么写了,临近 Csp,赶快复习一下。

分层图就是每一层都是一张原图,层与层之间在由边连接起来的图。

分层图具体表示的是使用 \(j\) 次免费通行的权限后到达 \(u\) 点的状态。

关于这道题,我们考虑怎么建图。

使用一张飞机票就代表我们走这条边的代价为 \(0\) ,我们可以有 \(i\) 这一层到 \(i+1\) 这一层的 \(u-v\) 连一条边权为零的边,

表示我们从 \(u\) 这个点到 \(v\) 这个点不需要花费代价。

为什么要往每一层都连边,是因为你坐飞机的顺序是不确定的。

图建出来大概长这样:

还要注意的点就是每一层的终点之间也要互相连边,因为你免费次数用几次可能会比都用完的方案要优。

我们最后最短路经过的边权为 \(0\) 的条数就是我们要用的免费次数。

关于 \(spfa\) ,他死了。别问我是怎么知道的,我就是在这里被卡的。

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
const int N = 1e6+10;
struct node{int to,net,w;}e[2500010];
priority_queue< pair<int , int> , vector< pair<int,int> > , greater< pair<int,int> > >q;
int n,m,k,x,y,w,tot,s,t;
int dis[N],head[N];
bool vis[N];
inline int read()
{
int s = 0, w = 1; char ch = getchar();
while(ch < '0' || ch > '9') {if(ch == '-') w = -1; ch = getchar();}
while(ch >= '0' && ch <= '9'){s = s * 10 + ch -'0';ch = getchar();}
return s * w;
}
void add(int x , int y , int w)
{
e[++tot].to = y;
e[tot].w = w;
e[tot].net = head[x];
head[x] = tot;
}
void dfs(int x)//dij
{
memset(dis , 0x3f3f3f , sizeof(dis));
q.push(make_pair(0,x));
dis[x] = 0;
while(!q.empty())
{
int t = q.top().second; q.pop();
if(vis[t]) continue;
vis[t] = 1;
for(int i = head[t]; i; i = e[i].net)
{
int to = e[i].to;
if(dis[to] > dis[t] + e[i].w)
{
dis[to] = dis[t] + e[i].w;
q.push(make_pair(dis[to] , to));
}
}
}
}
int main()
{
n = read(); m = read(); k = read();
s = read(); t = read();
for(int i = 1; i <= m; i++)
{
x = read(); y = read(); w = read();
add(x,y,w); add(y,x,w);//原图上连边
for(int i = 1; i <= k; i++)
{
add(x + n * (i-1) , y + n * i , 0);//层与层之间的点连一条边权为0的边
add(y + n * (i-1) , x + n * i , 0);
add(x + n * i , y + n * i , w);//每一层按原图连边
add(y + n * i , x + n * i , w);
}
}
for(int i = 1; i <= k; i++) add(t + n * (i-1) , t + n * i , 0);//每一层终点之间互相连边
dfs(s);
printf("%d\n",dis[t + n * k]);
return 0;
}

P4568 [JLOI2011]飞行路线 / P2939 [USACO09FEB]Revamping Trails G的更多相关文章

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

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

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

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

  3. [JLOI 2011]飞行路线&[USACO 09FEB]Revamping Trails

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

  4. [USACO09FEB] Revamping Trails 【分层图+Dijkstra】

    任意门:https://www.luogu.org/problemnew/show/P2939 Revamping Trails 题目描述 Farmer John dutifully checks o ...

  5. 洛谷 P4568 [JLOI2011]飞行路线

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

  6. 【luogu P4568 [JLOI2011]飞行路线】 题解

    题目链接:https://www.luogu.org/problemnew/show/P4568 卡了一晚上,算是分层图最短路的模板.注意卡SPFA,所以我写了个SLF优化. 同时 AC400祭!~ ...

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

    思路:裸的分层图最短路 提交:1次 题解: 如思路 代码: #include<cstdio> #include<iostream> #include<cstring> ...

  8. luogu P4568 [JLOI2011]飞行路线

    传送门 看到免费次数\(k\)最多只有10,可以考虑构建\(k+1\)层的分层图,即每一层正常连边,上下两层对应点连边权为0的单向边,最后对所有层里面的\(di_t\)取\(\max\)救星了 #in ...

  9. P4568 [JLOI2011]飞行路线

    思路 套路题 建出k+1分层图,从上一层走到下一层代表坐了一次免费航线,跑最短路即可 注意可能有情况不需要耗完所有k次机会,所以应从每层的终点向下一层终点连一条边权为0的边 代码 #include & ...

随机推荐

  1. vue 中PDF实现在线浏览,禁止下载,打印

    需求:在线浏览pdf文件,并且禁止掉用户下载打印的效果. 分析:普通的iframe.embed标签都只能实现在线浏览pdf的功能,无法禁止掉工具栏的下载打印功能.只能尝试使用插件,pdfobject. ...

  2. Unity3D中可重载虚函数的总结

    重载虚函数:Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Start,Update等函数,以下做个总结. A ...

  3. Construct a Matrix (矩阵快速幂+构造)

    There is a set of matrixes that are constructed subject to the following constraints: 1. The matrix ...

  4. 高可用集群corosync+pacemaker之pcs安装使用

    前文我们介绍了高可用集群corosync+pacemaker的集群管理工具crmsh的常用命令的使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/tag/crms ...

  5. Agumaster 改善了pagination

    页面越来越完善了.

  6. rabbitmq集成和实战

    与 Spring 集成 pom 文件 使用 Maven,这里使用的 4.3.11,所以这里引入的是 rabbit 是 2.0.0,如果兼容性的话请自行去 Spring 的官网上去查 这里补充一下,sp ...

  7. vue 实现原理及简单示例实现

    目录 相关html代码,用于被解析绑定数据 observer代码 Dep代码 Watcher 代码 Compile 代码 vue 简要构造函数 创建vue实例 结语 主要理解.实现如下方法: Obse ...

  8. 如何将tensorflow1.x代码改写为pytorch代码(以图注意力网络(GAT)为例)

    之前讲解了图注意力网络的官方tensorflow版的实现,由于自己更了解pytorch,所以打算将其改写为pytorch版本的. 对于图注意力网络还不了解的可以先去看看tensorflow版本的代码, ...

  9. 1. Linux系统优化

    1. 系统安装 本着纯净系统的原则,我们在安装系统时,应选择minimal install选项,来执行最小化安装,以便有需要时,安装我们需要的安装软件包. 操作系统为CentOS7.3 1611 下载 ...

  10. PyCharm2020.2.1激活方法

    本人亲测有效!直接看图! 安装准备 一.百度网盘链接:https://pan.baidu.com/s/151vnrZG2V4eMPW8RYqse3w   提取码:z5k0 至于Pycharm的安装在这 ...