P4568 [JLOI2011]飞行路线 分层图
题目描述
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。
输出格式
只有一行,包含一个整数,为最少花费。
输入输出样例
5 6 1
0 4
0 1 5
1 2 5
2 3 5
3 4 5
2 3 3
0 2 100
8
数据范围
解题技巧
这题一看第一眼就是分层图,感觉就是很简单,然后就发现自己死了,发现K这个东西一直不好处理,然后就想,可以建K层,每一层都是完全图,然后第Z层就表示是滴Z次免费的情况,把当前点的所有出边都往下面连一个费用是0的单向边,由于在坐飞机时可以是双向边,所以当前点的指向点就要从上一层连向下一层的当前点,写成代码就是这样
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&w);
add(x,y,w);
add(y,x,w);
for(int j=;j<=k;j++)
{
add(x+(j*n),y+(j*n),w);
add(y+(j*n),x+(j*n),w);
add(x+((j-)*n),y+(j*n),);
add(y+((j-)*n),x+(j*n),);
}
}
但要注意一点,假如在第二层就可以跑到终点,但最后我们输出的答案是第K层的终点的DIS,所以每一层的终点都要往下一层的终点连一条费用为0的边,不然会出事
for(int i=;i<=k;i++)
{
add(t+(i-)*n,t+i*n,);
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=1e6+;
int n,m,k,s,t;
int x,y,w;
struct edge
{
int to;
int value;
int next;
}way[maxn*];
int tot;
int dis[maxn];
bool vis[maxn];
int head[maxn];
void add(int x,int y,int w)
{
way[++tot].next=head[x];
way[tot].to=y;
way[tot].value=w;
head[x]=tot;
}
struct node
{
int dist,id;
node(){}
node(int dist,int id):dist(dist),id(id){}
};
bool operator <(node xi,node yi)
{
return xi.dist>yi.dist;
}
int dijkstra(int s)
{
priority_queue< node >q;
memset(dis,0x3f,sizeof(dis));
memset(vis,,sizeof(vis));
q.push(node(,s));
dis[s]=;
while(!q.empty())
{
node t(q.top());
q.pop();
int x=t.id;
if(vis[x])
{
continue;
}
vis[x]=;
for(int i=head[x];i;i=way[i].next)
{
int to=way[i].to;
if(dis[to]>way[i].value+t.dist)
{
dis[to]=way[i].value+t.dist;
q.push(node(dis[to],to));
}
}
}
}
int main()
{
memset(head,,sizeof(head));
scanf("%d%d%d",&n,&m,&k);
scanf("%d%d",&s,&t);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&w);
add(x,y,w);
add(y,x,w);
for(int j=;j<=k;j++)
{
add(x+(j*n),y+(j*n),w);
add(y+(j*n),x+(j*n),w);
add(x+((j-)*n),y+(j*n),);
add(y+((j-)*n),x+(j*n),);
}
}
for(int i=;i<=k;i++)
{
add(t+(i-)*n,t+i*n,);
}
dijkstra(s);
printf("%d",dis[t+k*n]);
}
P4568 [JLOI2011]飞行路线 分层图的更多相关文章
- P4568 [JLOI2011]飞行路线 分层图最短路
思路:裸的分层图最短路 提交:1次 题解: 如思路 代码: #include<cstdio> #include<iostream> #include<cstring> ...
- bzoj2763: [JLOI2011]飞行路线(分层图spfa)
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3234 Solved: 1235[Submit][Stat ...
- bzoj 2763: [JLOI2011]飞行路线 -- 分层图最短路
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MB Description Alice和Bob现在要乘飞机旅行,他们选择了一家相 ...
- BZOJ2763[JLOI2011]飞行路线 [分层图最短路]
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2523 Solved: 946[Submit][Statu ...
- [BZOJ2963][JLOI2011]飞行路线 分层图+spfa
Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并 ...
- BZOJ2763: [JLOI2011]飞行路线(分层图 最短路)
题意 题目链接 Sol 分层图+最短路 建\(k+1\)层图,对于边\((u, v, w)\),首先在本层内连边权为\(w\)的无向边,再各向下一层对应的节点连边权为\(0\)的有向边 如果是取最大最 ...
- 【bzoj2763】[JLOI2011]飞行路线 分层图最短路
题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的 ...
- bzoj 2763 [JLOI2011]飞行路线——分层图
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2763 分层图两种方法的练习. 1.把图分成k+1层,本层去上面一层的边免费.但空间时间都不算 ...
- bzoj2763 [JLOI2011]飞行路线——分层图
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2763 构建分层图. 代码如下: 写法1(空间略大)(时间很慢): #include<i ...
随机推荐
- 【从刷面试题到构建知识体系】Java底层-synchronized锁-1
在技术论坛中,经常看到一种言论:面试造火箭,干活拧螺丝.我们平时写的大部分代码的确是CRDU,再提一个层次,也无非就是揉进去复杂一些的业务逻辑,把一堆的CRDU组合起来. 那么问题来了:我们提倡的研究 ...
- 一份超级完整的PyCharm图解教程
微信搜索公众号:Python极客社区. 每天分享不一样的Python干货 PyCharm 是一种 Python IDE,可以帮助程序员节约时间,提高生产效率.那么具体如何使用呢?本文从 PyCharm ...
- C# 获取pdf长宽,反推pdf图纸类型
业务需求:读取pdf每页的长宽,然后根据国际标准,反推出pdf图纸类型 第一步:下载类库,并引入到项目中 链接:https://pan.baidu.com/s/1ud4-xhfDvi9OKolEBPw ...
- C#学习--SQL server数据库基本操作(连接、增、删、改、查)封装
写在前面: 在日常的工作中,通常一个项目会大量用的数据库的各种基本操作,因此小编几个常见的数据库的操作封装成了一个dll方便后续的开发使用.SQLserver数据库是最为常见的一种数据库,本文则主要是 ...
- VM虚拟机启动夜神模拟器卡99%解决办法
VM虚拟机启动夜神模拟器卡99%解决办法 本人出现的情况: 物理机装的是win7系统,安装了vmware14(安装过程未出现报错),在vmware14 上 win10系统(安装过程未出现报错),安装夜 ...
- 阿里云 RDS 数据库又发 CPU 近 100% 的“芯脏病”
最近云界发生了2件事,一件是大事,一件是小事,大事是阿里云与微软合作推出了开放应用模型 Open Application Model(OAM),小事是由于微软 SQL Server 在阿里云上水土不服 ...
- Python_三元运算与lambda表达式
[是什么] 三元运算是if...else...的简化版,lambda表达式是函数的简化版 三元运算(三目运算) # 判断两个数中的较大者 fun(a1,a2): return a1 if a1> ...
- 从零开始搭建前端监控系统(三)——实现控制iframe前进后退
前言 本系列文章旨在讲解如何从零开始搭建前端监控系统. 项目已经开源 项目地址: https://github.com/bombayjs/bombayjs (web sdk) https://gith ...
- JavaScript专题之事件循环
准备知识 1. 进程(process) 进程是系统资源分配一个独立单位,一个程序至少有一个进程.比方说:一个工厂代表一个 CPU, 一个车间就是一个进程,任一时刻,只能有一个进程在运行,其他进程处于非 ...
- Cocos2d-x 学习笔记(20) ControlButton
[Cocos2d-x 学习笔记 目录链接] 1. 简介 ControlButton实现了按钮功能,根据触摸的位置和移动的过程可识别9中EventType类型,执行对应的回调函数. 直接继承了Contr ...