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. ASP.NET MVC进阶二

    一.数据验证 数据验证的步骤 在模型类中添加与验证相关的特性标记 在客户端导入与验证相关的js文件和css文件 使用与验证相关的Html辅助方法 在服务器端判断是否通过服务器端验证 常用的验证标记 R ...

  2. 百度FIS入门

    1.fis作为nodejs的模块来管理的,所以首先得安装nodejs,看我前面的安装nodejs的文章. 2.官方的案例下载包https://github.com/hefangshi/fis-quic ...

  3. No.003:Longest Substring Without Repeating Characters

    问题: Given a string, find the length of the longest substring without repeating characters.Example:Gi ...

  4. cas与NGINX整合(转)

    CAS (5) -- Nginx代理模式下浏览器访问CAS服务器配置详解 标签: 服务器 2015-12-18 15:04 1633人阅读 评论(0) 收藏 举报  分类: 网络(61)    目录( ...

  5. .NET WinForm画树叶小程序

    看了一片文章(http://keleyi.com/a/bjac/nurox416.htm),是使用分型画树叶,代码是Java的,因为Java很久没弄了,改用C#实现,下载地址: 画树叶小程序下载 核心 ...

  6. 关于js中两种定时器的设置及清除

    1.JS中的定时器有两种: window.setTimeout([function],[interval]) 设置一个定时器,并且设定了一个等待的时间[interval],当到达时间后,执行对应的方法 ...

  7. JavaScript hasOwnProperty() 函数详解

    hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性.如果有,返回true,否则返回false. 该方法属于Object对象,由于所有的对象都"继承 ...

  8. SAP数据更新的触发

    SAP 应用系统架构         应用层运行着DIALOG进程,每个DIALOG进程绑定一个数据库进程,DIALOG进程与GUI进行通信,每次GUI向应用服务器发送请求时都会通过dispatche ...

  9. 关于const和define的内存分配问题的总结

    关于const和define的内存分配问题 const与#define宏定义的区别----C语言深度剖析 1,  const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静 ...

  10. java多线程系列4-线程池

    在之前的文章中,学习了通过实现java.lang.Runnable来定义类,以及像下面这样创建一个线程来运行任务: Runnable task = new TaskClass(task); new T ...