P4568 [JLOI2011]飞行路线 / P2939 [USACO09FEB]Revamping Trails G
题目描述
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的更多相关文章
- 洛谷 P4568 [JLOI2011]飞行路线 解题报告
P4568 [JLOI2011]飞行路线 题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在\(n\)个城市设有业务,设这些城市分别标记为0到\(n−1\ ...
- 洛谷 P4568 [JLOI2011]飞行路线 题解
P4568 [JLOI2011]飞行路线 题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在\(n\)个城市设有业务,设这些城市分别标记为\(0\)到\( ...
- [JLOI 2011]飞行路线&[USACO 09FEB]Revamping Trails
Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并 ...
- [USACO09FEB] Revamping Trails 【分层图+Dijkstra】
任意门:https://www.luogu.org/problemnew/show/P2939 Revamping Trails 题目描述 Farmer John dutifully checks o ...
- 洛谷 P4568 [JLOI2011]飞行路线
题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的 ...
- 【luogu P4568 [JLOI2011]飞行路线】 题解
题目链接:https://www.luogu.org/problemnew/show/P4568 卡了一晚上,算是分层图最短路的模板.注意卡SPFA,所以我写了个SLF优化. 同时 AC400祭!~ ...
- P4568 [JLOI2011]飞行路线 分层图最短路
思路:裸的分层图最短路 提交:1次 题解: 如思路 代码: #include<cstdio> #include<iostream> #include<cstring> ...
- luogu P4568 [JLOI2011]飞行路线
传送门 看到免费次数\(k\)最多只有10,可以考虑构建\(k+1\)层的分层图,即每一层正常连边,上下两层对应点连边权为0的单向边,最后对所有层里面的\(di_t\)取\(\max\)救星了 #in ...
- P4568 [JLOI2011]飞行路线
思路 套路题 建出k+1分层图,从上一层走到下一层代表坐了一次免费航线,跑最短路即可 注意可能有情况不需要耗完所有k次机会,所以应从每层的终点向下一层终点连一条边权为0的边 代码 #include & ...
随机推荐
- JS开发必须知道的41个技巧
JS是前端的核心,但有些使用技巧你还不一定知道:本文梳理了JS的41个技巧,帮助大家提高JS的使用技巧: Array 1.数组交集 普通数组 const arr1 = [, , , , , ,],ar ...
- android开发之gridView的一些属性。(项目经验总结)
1.android:numColumns="auto_fit" //GridView的列数设置为自动 2.android:columnWidth="90dp &quo ...
- A little something to get you started(Hacker101 CTF)
打开题目的页面发现只有”Welcome to level 0. Enjoy your stay.“这么一行普通的文字,然后习惯性的打开浏览器的开发者工具的“network”模块,按下F5发现网页在请求 ...
- android 数据绑定(4)实用特性及疑惑:使用控件、格式化@string/xxx、对象传递、双向数据绑定
1.在布局内使用其它控件 1.1 效果 箭头所指3个控件的内容随输入框内容而变化. 1.2 示例代码 <?xml version="1.0" encoding="u ...
- three.js尝试(一)模拟演唱会效果
工作闲暇之余,偶然翻到了Three.js的官网,立刻被它酷炫的案例给惊艳到了,当即下定决心要试验摸索一番,于是看demo,尝试,踩坑,解决问题,终于搞定了,一个模拟演唱会场景. 主角围绕一个钢管在舞动 ...
- springboot +jsp项目打包部署到华为云服务器
注:打包之前先保证你的项目本地运行没问题. 一.打包 打包有两种方式,打成jar包和打成war包.因为springboot有内置的服务器,所以选择打成jar包,这样云服务器就不用装tomcat了. 打 ...
- C007:输入美元数量,用最少的20美元,10美元,5美元和1美元付款
代码: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int amount; do{ printf(&quo ...
- SqlAnalyzer1.01 源码
源码下载:https://files.cnblogs.com/files/heyang78/SqlAnalyzer-20200529-2.rar 现有功能:不带函数允许嵌套的select ...fro ...
- nodeJS 下载与安装,环境配置
1.什么是nodeJs: 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一 ...
- pycharm之ctrl+鼠标滚轮调整字体大小
按照图示设置,可以添加:ctrl+鼠标滚轮调整字体大小功能 1. 2.