[BZOJ 2763][JLOI 2011] 飞行路线
2763: [JLOI2011]飞行路线
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 3203 Solved: 1223
[Submit][Status][Discuss]Description
Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司。该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格。Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机。航空公司对他们这次旅行也推出优惠,他们可以免费在最多k种航线上搭乘飞机。那么Alice和Bob这次出行最少花费多少?Input
数据的第一行有三个整数,n,m,k,分别表示城市数,航线数和免费乘坐次数。第二行有两个整数,s,t,分别表示他们出行的起点城市编号和终点城市编号。(0<=s,t<n)接下来有m行,每行三个整数,a,b,c,表示存在一种航线,能从城市a到达城市b,或从城市b到达城市a,价格为c。(0<=a,b<n,a与b不相等,0<=c<=1000)Output
只有一行,包含一个整数,为最少花费。Sample Input
5 6 1
0 4
0 1 5
1 2 5
2 3 5
3 4 5
2 3 3
0 2 100Sample Output
8HINT
对于30%的数据,2<=n<=50,1<=m<=300,k=0;
对于50%的数据,2<=n<=600,1<=m<=6000,0<=k<=1;
对于100%的数据,2<=n<=10000,1<=m<=50000,0<=k<=10.
题意
给出一个无向图, 求从指定结点到达另一个指定结点的最短路, 其中有 $k$ 次机会可以忽视某一条边的长度.
题解
看起来像是普通的最短路, 但是 $k$ 次免费机会给了这个最短路不少不确定因素. 但是我们不难得出结论: 只要最短路上的边数多于 $k$ , 最优解一定使用了 $k$ 次免费机会. 所以我们可以使用二维最短路来解决这个问题, 与一维最短路非常相似, 不同的是在维护最短路的时候要多维护一个如果使用一次免费机会则可以得到的最短路值.
参考代码
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm> const int MAXV=;
const int MAXE=;
const int MAXK=; struct Edge{
int from;
int to;
int dis;
Edge* next;
};
Edge E[MAXE];
Edge* head[MAXV];
Edge* top=E; int v;
int e;
int k;
int s;
int t;
int dis[MAXV][MAXK];
bool visited[MAXV][MAXK]; std::deque< std::pair<int,int> > q; void SPFA(int);
void Initialize();
void FastRead(int&);
void Insert(int,int,int); int main(){
Initialize();
SPFA(s);
printf("%d\n",dis[t][k]);
return ;
} void SPFA(int s){
int used;
memset(dis,0x3F,sizeof(dis));
dis[s][]=;
visited[s][]=true;
q.push_front(std::make_pair(s,));
while(!q.empty()){
std::pair<int,int> p=q.front();
q.pop_front();
s=p.first;
used=p.second;
visited[s][used]=false;
for(Edge* i=head[s];i!=NULL;i=i->next){
if(dis[i->to][used]>dis[s][used]+i->dis){
dis[i->to][used]=dis[s][used]+i->dis;
if(!visited[i->to][used]){
visited[i->to][used]=true;
if(!q.empty()&&dis[i->to][used]<dis[q.front().first][q.front().second])
q.push_front(std::make_pair(i->to,used));
else
q.push_back(std::make_pair(i->to,used));
}
}
if(used<k&&dis[i->to][used+]>dis[s][used]){
dis[i->to][used+]=dis[s][used];
if(!visited[i->to][used+]){
visited[i->to][used+]=true;
if(!q.empty()&&dis[i->to][used]<dis[q.front().first][q.front().second])
q.push_front(std::make_pair(i->to,used+));
else
q.push_back(std::make_pair(i->to,used+));
}
}
}
}
} void Initialize(){
int a,b,c;
FastRead(v);
FastRead(e);
FastRead(k);
FastRead(s);
FastRead(t);
for(int i=;i<e;i++){
scanf("%d%d%d",&a,&b,&c);
Insert(a,b,c);
Insert(b,a,c);
}
} inline void Insert(int from,int to,int dis){
top->to=to;
top->dis=dis;
top->from=from;
top->next=head[from];
head[from]=top;
top++;
} inline void FastRead(int& target){
target=;
register char ch=getchar();
while(!isdigit(ch))
ch=getchar();
while(isdigit(ch)){
target=target*+ch-'';
ch=getchar();
}
}
Backup

[BZOJ 2763][JLOI 2011] 飞行路线的更多相关文章
- [JLOI 2011]飞行路线&[USACO 09FEB]Revamping Trails
Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并 ...
- [BZOJ 2299][HAOI 2011]向量 题解(裴蜀定理)
[BZOJ 2299][HAOI 2011]向量 Description 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), ...
- ACM-ICPC 2018 南京赛区网络预赛 L && BZOJ 2763 分层最短路
https://nanti.jisuanke.com/t/31001 题意 可以把k条边的权值变为0,求s到t的最短路 解析 分层最短路 我们建立k+1层图 层与层之间边权为0,i 向 i+1层转 ...
- [BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明)
[BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明) 题面 T组询问,每次给出a,b,c,d,k,求\(\sum _{i=a}^b\sum _{j=c}^d[ ...
- 分层图+最短路算法 BZOJ 2763: [JLOI2011]飞行路线
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MB Description Alice和Bob现在要乘飞机旅行,他们选择了一家相 ...
- BZOJ 2763: [JLOI2011]飞行路线 最短路
2763: [JLOI2011]飞行路线 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- Bzoj 2763: [JLOI2011]飞行路线 dijkstra,堆,最短路,分层图
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1728 Solved: 649[Submit][Statu ...
- Bzoj 2763: [JLOI2011]飞行路线 拆点,分层图,最短路,SPFA
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1694 Solved: 635[Submit][Statu ...
- bzoj 2763: [JLOI2011]飞行路线 -- 分层图最短路
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MB Description Alice和Bob现在要乘飞机旅行,他们选择了一家相 ...
随机推荐
- [中英对照]The sysfs Filesystem | sysfs文件系统
The sysfs Filesystem | sysfs文件系统 Abstract | 摘要 sysfs is a feature of the Linux 2.6 kernel that allow ...
- linux 段页式内存管理
http://blog.chinaunix.net/uid-24227137-id-3723898.html 页是信息的物理单位,分页是为了实现离散分配方式,以消减内存的外零头,提高内存的利用率从:或 ...
- 嵌套div的margin-top不生效
之前遇到过嵌套div设置margin-top不生效的情况,一直没去研究,今天又遇到了,查阅资料得知原因,并不是margin-top没生效,只是当外层容器跟内层容器之间没有别的元素的时候,内层容器的ma ...
- Digitale Logik
1.Zahl System und Code System 1.1 Die Rechnung des Ergänzungscode 1.2 Manche häufig verwendet Code 1 ...
- Canvas 绘制矩形,圆形,不规则图形(线条),渐变等图像效果
绘制矩形: getContext("2d") 对象是内建的 HTML5 对象,拥有多种绘制路径.矩形.圆形.字符以及添加图像的方法. fillStyle 方法将其染成红色,fill ...
- 八个常用的js正则表达式
开篇:开发中如果有input输入框,难免就要写正则表达式,因此在这里总结了一些常见常用的正则表达式的书写方法,希望会大家有所帮助: 附图: 一.手机号码 $(document).ready(funct ...
- Rsyslog+ELK日志分析系统
转自:https://www.cnblogs.com/itworks/p/7272740.html Rsyslog+ELK日志分析系统搭建总结1.0(测试环境) 因为工作需求,最近在搭建日志分析系统, ...
- 图解源码之java锁的获取和释放(AQS)篇
以独占式不公平锁为例,通过5个线程争夺ReentrantLock的过程,图解ReentrantLock源码实现,了解显示锁的工作流程. 任何时刻拿到锁的只有一个线程,未拿到锁的线程会打包成节点(nod ...
- 用手机管理及维护MySQL,Oracle等数据库
现在移动办公的情况及需求越来越多,平时MySQL,Oracle,SQLServer等数据库的管理都要通过客户端工具操作,现在有一款基于web网页的软件:TreeSoft数据库管理系统,在服务器布署一套 ...
- IDEA 搭建 springmvc maven 项目
前言:将搭建 java springmvc maven 项目的过程及问题记录下来,以及配置文件.这次没有涉及到数据库,后续再写. 目录: 一.首先在 IDEA 中创建 springmvc maven ...