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. 解决死锁SQL

    USE [master]GO/****** Object: StoredProcedure [dbo].[p_lockinfo] Script Date: 04/03/2014 15:12:40 ** ...

  2. SignalR-入门

    1.什么是SignalR: ASP.NET SignalR是为简化开发开发人员将实时web内容添加到应用程序过程而提供的类库.实时web功能指的是让服务器代码可以随时主动推送内容给客户端,而不是让服务 ...

  3. c语言笔试题

    填空: 1,short int a[10]={123, 456, 789}; sizeof(a)=(       ); short int *p=&a, 则sizeof(p)=(       ...

  4. 清除浮动after

    .clearf{display: inline-block;} .clearf:after { content: "."; display: block; height:; cle ...

  5. 【译】Dependency Injection with Autofac

    先说下为什么翻译这篇文章,既定的方向是架构,然后为了学习架构就去学习一些架构模式.设计思想. 突然有一天发现依赖注入这种技能.为了使得架构可测试.易维护.可扩展,需要架构设计为松耦合类型,简单的说也就 ...

  6. ASP.NET获取请求的url信息汇总

    ASP.NET获取请求的url信息汇总 最近做项目需要处理一个用代码获取当前网站的域名或ip信息的问题,于是尝试了ASP.NET中各种获取url信息的方法,在此总结一下: 在Global.asax文件 ...

  7. 更轻量的 View Controllers

    iew controllers 通常是 iOS 项目中最大的文件,并且它们包含了许多不必要的代码.所以 View controllers 中的代码几乎总是复用率最低的.我们将会看到给 view con ...

  8. iOSQuartz2D-04-手动剪裁图片并保存到相册

    实现效果 操作步骤 绘制一个矩形框,弹出一个alertView,提示是否保存图片 点击"是",将图片保存到相册 在相册中查看保存的图片 效果图 实现思路 在控制器的view上添加一 ...

  9. Objective-C之用C的字符来处理NSString相关的字符替换和拼接的问题

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  10. C++语言出现的bug

    输出语句不管是C语言的printf();还是cout << "" << endl; 在循环语句中会出现一个bug: 下面是不正常的两种情况: 下面是正常的: ...