题目描述

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. Chrome开发者工具调试详解

    chrome开发者工具最常用的四个功能模块:元素(ELements).控制台(Console).源代码(Sources),网络(Network). 元素(Elements):用于查看或修改HTML元素 ...

  2. for、forEach、map、for...in、for...of的区别以及能否终止循环的总结

    有时候面试会提到,用的时候又不在意,今天有空挨个做了测试,总结如下:

  3. 开发者的福音,LR.NET模块化代码生成器

    代码生成器,是快速开发平台的核心功能之一,是一种用来帮助缺乏经验或者时间的开发者快速生成规范代码的工具,可以在极大程度上提升开发者的工作效率, 能有效避免重复工作.但稍有经验的开发者都明白,代码生成器 ...

  4. 企业网站还是要考虑兼容至少IE10

    中国国情,大部分企业还在使用win7,IE浏览器.为了兼容这些,还是少用比较VUE等一些高级的框架,改为使用jquery.用惯了VUE,jquey好多忘得差不多了,其中遇到的问题及解决方案 ajax, ...

  5. SpringBoot整合MinIO

    今天因为公司的需求接触到这个东西,我们先来看下MinIO的官网简介 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务.它兼容亚马逊S3云存储服务接口,非常适合于存储大 ...

  6. 理解C#中的ExecutionContext vs SynchronizationContext

    原文:https://devblogs.microsoft.com/pfxteam/executioncontext-vs-synchronizationcontext/ 作者:Stephen 翻译: ...

  7. IDEA使用maven搭建SSM框架整合项目(超级详细,值得一看)

    目录 温馨提示 简单介绍下SSM 搭建过程 一.框架介绍 二.下载Maven 三.创建Maven项目 四.Maven工程需要引入的Jar 包 五.整合SSM框架.需要的相关配置文件配置项目 六.工程导 ...

  8. SpringBoot中使用切面的每次传的参数,进行解析,验签,并返回解码后的参数

    目的,在每次请求的时候,对每次传的参数,进行解析,验签,并返回解码后的参数, 以json传递: 例子背景: IOT平台提供对外可访问的接口, 需要对所有参数的传递做到 不泄露.认证的目的:所以需要在每 ...

  9. JVM-垃圾回收篇

    目录 JVM-垃圾回收篇 前言 举个例子 JVM 有哪些垃圾回收算法? 标记-清除算法 复制算法 标记-整理算法 分代收集算法 JVM 有哪些垃圾回收器? 概述 几个相关概念 一:Serial 收集器 ...

  10. archaius(4) 属性对象

    讲完上一节,我们就可以使用合理的配置管理器或者实现自己的配置管理来管理我们的配置项了.archaius还提供了一种新的配置使用的方式. 动态属性对象 动态属性对象针对每个配置项以对象方式进行操作,并且 ...