2763: [JLOI2011]飞行路线

Time Limit: 10 Sec  Memory Limit: 128 MB

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.

 #include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 11000
#define M 51000
#define inf 0x3f3f3f3f
using namespace std;
struct KSD
{
int v,len,next;
}e[M<<];
int head[N],cnt;
struct Lux
{
int x,y;
Lux(int a,int b):x(a),y(b){}
Lux(){}
};
void add(int u,int v,int len)
{
++cnt;
e[cnt].v=v;
e[cnt].len=len;
e[cnt].next=head[u];
head[u]=cnt;
}
int n,m,p,s,t;
int dist[][N];
bool in[][N];/*spfa的dist,标记在每一层都要有*/
queue<Lux>q;
int spfa()
{
int i,v;
memset(dist,0x3f,sizeof(dist));
q.push(Lux(,s));/*从第0层开始spfa*/
dist[][s]=;
in[][s]=;
while(!q.empty())
{
Lux U=q.front();
q.pop();
in[U.x][U.y]=; for(i=head[U.y];i;i=e[i].next)
{
v=e[i].v;/*先跑完这一层的最短路*/
if(dist[U.x][v]>dist[U.x][U.y]+e[i].len)
{
dist[U.x][v]=dist[U.x][U.y]+e[i].len;
if(!in[U.x][v])q.push(Lux(U.x,v)),in[U.x][v]=;
}
}
if(U.x<p)for(i=head[U.y];i;i=e[i].next)
{/*如果还可以向下一层转移的话,就把这个点出发的每一条边都设为免费下一层转移,因为要记录每个点dist到底用了几个免费的路线,所以用二维数组--分层思想*/
v=e[i].v;
if(dist[U.x+][v]>dist[U.x][U.y])
{
dist[U.x+][v]=dist[U.x][U.y];
if(!in[U.x+][v])q.push(Lux(U.x+,v)),in[U.x+][v]=;
}
}
} int ret=inf;
for(i=;i<=p;i++)ret=min(ret,dist[i][t]);/*在每一层中都找到t的最小值(最多k条免费),为什么要在每一层都找,而不是只在最后一层寻找呢。假设有这么一种情况,由s--t的最少的路上的途径数目少于k条,那么在k之前的某一层上就有dis=0,但是如果必须使用k条路径的话,那么就会找的一条路途数多于k的路来满足这个条件,那么只用第k层的dis自然不是正确结果了。*/
return ret;
} int main()
{
// freopen("test.in","r",stdin);
int i,j,k;
int a,b,c;
scanf("%d%d%d%d%d",&n,&m,&p,&s,&t);
for(i=;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);/*无向图建立双向边*/
add(b,a,c);
}
printf("%d\n",spfa());
return ;
}
 /*我的代码*/
#define K 11
#include<iostream>
using namespace std;
#include<cstdio>
#include<queue>
#include<cstring>
#define N 10010
#define M 50010
struct QU{
int ce,bh;
};
struct Edge{
int v,w,last;
}edge[M<<];
int head[N],dis[K][N],k,n,m,t=,sta,en;
bool inque[K][N];
inline int read()
{
int ff=,ret=;
char s=getchar();
while(s<''||s>'')
{
if(s=='-') ff=-;
s=getchar();
}
while(s>=''&&s<='')
{
ret=ret*+s-'';
s=getchar();
}
return ret*ff;
}
void add_edge(int u,int v,int w)
{
++t;
edge[t].v=v;
edge[t].w=w;
edge[t].last=head[u];
head[u]=t;
}
void input()
{
n=read();m=read();k=read();
sta=read();en=read();
int a,b,c;
for(int i=;i<=m;++i)
{
a=read();b=read();c=read();
add_edge(a,b,c);
add_edge(b,a,c);
}
}
void SPFA()
{
memset(dis,,sizeof(dis));/*注意赋值的最大值不要超界*/
dis[][sta]=;
inque[][sta]=true;
queue<QU>Q;
QU A;
A.ce=;
A.bh=sta;
Q.push(A);
while(!Q.empty())
{
QU NOw=Q.front();
Q.pop();
inque[NOw.ce][NOw.bh]=false;
for(int l=head[NOw.bh];l;l=edge[l].last)
{
if(dis[NOw.ce][edge[l].v]>edge[l].w+dis[NOw.ce][NOw.bh])
{
dis[NOw.ce][edge[l].v]=edge[l].w+dis[NOw.ce][NOw.bh];
if(!inque[NOw.ce][edge[l].v])
{
inque[NOw.ce][edge[l].v]=true;
QU C;
C.bh=edge[l].v;
C.ce=NOw.ce;
Q.push(C);
}
}
}
if(NOw.ce==k) continue;
for(int l=head[NOw.bh];l;l=edge[l].last)
{
if(dis[NOw.ce+][edge[l].v]>dis[NOw.ce][NOw.bh])
{
dis[NOw.ce+][edge[l].v]=dis[NOw.ce][NOw.bh];
if(!inque[NOw.ce+][edge[l].v])
{
inque[NOw.ce+][edge[l].v]=true;
QU C;
C.bh=edge[l].v;
C.ce=NOw.ce+;
Q.push(C);
}
}
}
}
}
int main()
{
input();
SPFA();
int ans=(<<)-;
for(int i=;i<=k;++i)
ans=min(ans,dis[i][en]);
printf("%d\n",ans);
return ;
}

分层图+最短路算法 BZOJ 2763: [JLOI2011]飞行路线的更多相关文章

  1. 分层图最短路【bzoj2763】: [JLOI2011]飞行路线

    bzoj2763: [JLOI2011]飞行路线 Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0 ...

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

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

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

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

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

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

  5. BZOJ 2763: [JLOI2011]飞行路线 【分层图模板】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2763 2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  M ...

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

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

  7. bzoj 2763 [JLOI2011]飞行路线——分层图

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2763 分层图两种方法的练习. 1.把图分成k+1层,本层去上面一层的边免费.但空间时间都不算 ...

  8. bzoj 2763: [JLOI2011]飞行路线【分层图+spfa】

    为什么早年的题总是从0开始标号啊--又zz了一次WA 分层图的题只有这一个套路吧,建分层图,然后优化时间是分层跑spfa然后层与层之间单独跑即可 #include<iostream> #i ...

  9. bzoj 2763: [JLOI2011]飞行路线

    #include<cstdio> #include<cstring> #include<iostream> #include<queue> #defin ...

随机推荐

  1. JSONArray.toCollection 封装 bean 失败

    1. 问题描述: 通过http请求服务端, 返回的bean的集合的字符串形式, 其中bean中的Date类型的属性值,形式为Long类型的表示形式(1466083519000): String res ...

  2. 设计模式总结篇系列:观察者模式(Observer)

    观察者模式中通常有两个基本的概念主题:观察者和被观察者.当被观察者状态发生改变时,需要通知相应的观察者,当然,每个被观察者所对应的观察者可能不知一个,他们之间是1:n的关系.用专业一点的术语对观察者模 ...

  3. 什么是目标框架别名(What are the Target Framework Monikers (TFMs))?

    我们现在的.NET Core 1.0应用(ASP.NET Core 1.0应用或控制台应用)有了新的被运行在不同框架上的可能性:①运行在.NET Core平台上 ②运行在传统的.NET Framewo ...

  4. 配置文件,环境配置和war报分离,方便生产更改

    在生产环境实现配置文件和war包 的分离,为方便在必要的时候进行一定的更改,可以避免修改包,但是需要重启 最初为这样的选择配置,单不知为何未生效,修改为配置2配置方法,但不灵活,待跟进.配置1: &l ...

  5. Android笔记——Android中数据的存储方式(三)

    Android系统集成了一个轻量级的数据库:SQLite,所以Android对数据库的支持很好,每个应用都可以方便的使用它.SQLite作为一个嵌入式的数据库引擎,专门适用于资源有限的设备上适量数据存 ...

  6. PlayFramework 1 自定义标签 -- FastTags http://unmi.cc/category/javajee/playframework/

    最早是用 HTML 来自定义标签,现在觉得 HTML 写有关逻辑的代码就有点不伦不类了,HTML 里着重是显示代码.前有一篇  PlayFramework 1 模板应用 -- Java 对象扩展 学习 ...

  7. TSQL生成Combguid

    Nhibernate实现combguid /// <summary> /// Generate a new <see cref="Guid"/> using ...

  8. java调用html模板发送html内容的邮件

    在项目需要发送邮件,普通内容的邮件觉得太单调.太丑,没逼格,所以说直接把用到的邮件内容做成一个html模板,发送之前将对应参数替换掉,发送html内容的高逼格邮件. 首先需要引用jar包,这就不多说了 ...

  9. OAUTH 协议介绍

    OAUTH 产生背景 随着互联网的深入发展,一些互联网巨头积累了海量的用户和数据.对于平台级软件厂商来说,用户的需求多种多样,变化万千 以一己之力予以充分满足,难免疲于本命.因此将数据以接口的形式开放 ...

  10. Spark GraphX学习资料

    <Spark GraphX 大规模图计算和图挖掘> http://book.51cto.com/art/201408/450049.htm http://www.csdn.net/arti ...