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 100

Sample Output

8

HINT

对于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$ 次免费机会. 所以我们可以使用二维最短路来解决这个问题, 与一维最短路非常相似, 不同的是在维护最短路的时候要多维护一个如果使用一次免费机会则可以得到的最短路值.

参考代码

GitHub

 #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] 飞行路线的更多相关文章

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

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

  2. [BZOJ 2299][HAOI 2011]向量 题解(裴蜀定理)

    [BZOJ 2299][HAOI 2011]向量 Description 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), ...

  3. ACM-ICPC 2018 南京赛区网络预赛 L && BZOJ 2763 分层最短路

    https://nanti.jisuanke.com/t/31001 题意 可以把k条边的权值变为0,求s到t的最短路 解析  分层最短路  我们建立k+1层图 层与层之间边权为0,i 向 i+1层转 ...

  4. [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[ ...

  5. 分层图+最短路算法 BZOJ 2763: [JLOI2011]飞行路线

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MB Description Alice和Bob现在要乘飞机旅行,他们选择了一家相 ...

  6. BZOJ 2763: [JLOI2011]飞行路线 最短路

    2763: [JLOI2011]飞行路线 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  7. Bzoj 2763: [JLOI2011]飞行路线 dijkstra,堆,最短路,分层图

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1728  Solved: 649[Submit][Statu ...

  8. Bzoj 2763: [JLOI2011]飞行路线 拆点,分层图,最短路,SPFA

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1694  Solved: 635[Submit][Statu ...

  9. bzoj 2763: [JLOI2011]飞行路线 -- 分层图最短路

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MB Description Alice和Bob现在要乘飞机旅行,他们选择了一家相 ...

随机推荐

  1. http协议--文章一

    一 原理区别 一般在浏览器中输入网址访问资源都是通过GET方式:在FORM提交中,可以通过Method 指定提交方式为GET或者POST,默认为GET提交 Http定义了与服务器交互的不同方法,最基本 ...

  2. spring cloud连载第二篇之Spring Cloud Config

    Spring Cloud Config Spring Cloud Config为分布式服务提供了服务侧和客户侧的外部配置支持.通过Spring Cloud Config你可以有一个统一的地方来管理所有 ...

  3. 问题集录--TensorFlow深度学习

    TensorFlow深度学习框架 Google不仅是大数据和云计算的领导者,在机器学习和深度学习上也有很好的实践和积累,在2015年年底开源了内部使用的深度学习框架TensorFlow. 与Caffe ...

  4. CSS3 Media Queries_media queries, css3属性详解

    Media Queries直译过来就是"媒体查询",在我们平时的Web页面中head部分常看到这样的一段代码: <link href="css/reset.css& ...

  5. 从0开始整合SSM框架--2.spring整合mybatis

    依赖:<properties> <!-- spring版本号 --> <spring.version>4.1.3.RELEASE</spring.versio ...

  6. 六、yarn运行模式

    简介 spark的yarn运行模式根据Driver在集群中的位置分成两种: 1)yarn-client 客户端模式 2)yarn-cluster 集群模式 yarn模式和standalone模式不同, ...

  7. CSS 基础点

    Part1:font:inherit 字体的设置 设置所有元素的字体保持一致: 所有元素:*{font:inherit;} /* IE8+ */ body体用percent:body{font:100 ...

  8. 【SSH网上商城项目实战02】基本增删查改、Service和Action的抽取以及使用注解替换xml

    转自:https://blog.csdn.net/eson_15/article/details/51297698 上一节我们搭建好了Struts2.Hibernate和Spring的开发环境,并成功 ...

  9. js 防止连续点击

    简称 js防连点 var flag = true; $(".yzm>span").click(function(){ if(!flag){       return fals ...

  10. cookie、session、分页

    一.cookie HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情 ...