BZOJ 2763 飞行路线(最短路)

来源:互联网 发布:手机淘宝退货退款流程 编辑:程序博客网 时间:2024/05/29 17:58

思路:显然直接的最短路是不可行的,因为可以选择k条路是免费的,那么我们可以在dijkstra转移的时候多加一维,令d[i][j]为走到i结点已经用了j次免费次数的最小花费即可


#include<bits/stdc++.h>using namespace std;const int maxn = 10000+500;#define INF 1e9int n,m,k;vector<pair<int,int> >e[maxn];int d[maxn][12];int inq[maxn][12];void init(){memset(inq,0,sizeof(inq));for(int i = 0;i<=n;i++)for(int j = 0;j<=k;j++)d[i][j]=INF;}void dijkstra(int s){    d[s][0]=0;queue<pair<int,int> >q;inq[s][0]=1;q.push(make_pair(s,0));while(!q.empty()){        pair<int,int> now = q.front();q.pop();inq[now.first][now.second]=0;for(int i = 0;i<e[now.first].size();i++){int v = e[now.first][i].first;if(d[v][now.second]> d[now.first][now.second]+e[now.first][i].second){                d[v][now.second] = d[now.first][now.second]+e[now.first][i].second;if(!inq[v][now.second]) q.push(make_pair(v,now.second));inq[v][now.second]=1;}if(now.second < k && d[now.first][now.second] < d[v][now.second+1]){                d[v][now.second+1]=d[now.first][now.second];if(!inq[v][now.second+1])q.push(make_pair(v,now.second+1));inq[v][now.second+1]=1;}}}}int main(){while(scanf("%d%d%d",&n,&m,&k)!=EOF){init();        int s,t;scanf("%d%d",&s,&t);s++,t++;        for(int i = 0;i<m;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);u++,v++;e[u].push_back(make_pair(v,w));e[v].push_back(make_pair(u,w));}dijkstra(s);        int ans = INF;for(int i = 0;i<=k;i++)ans = min(ans,d[t][i]);printf("%d\n",ans);}}


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 10 40 1 51 2 52 3 53 4 52 3 30 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.



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 ipad账号被锁定怎么办 苹果平板停用了怎么办 pad忘记id密码怎么办 京东实名开小差怎么办 路由器信号太强怎么办 wifi被破解了怎么办 眼睛被电光刺伤怎么办 被紫外线灯照射怎么办 浴巾洗了发硬怎么办 枕巾上的头油怎么办 洗手盆缝隙漏水怎么办 洗手盆裂缝漏水怎么办 洗手盆堵了怎么办 征信账号注册怎么办 注册不了征信号怎么办 阿里巴巴一键铺货到淘宝发货怎么办 淘宝购物的问题怎么办 买家评价被删除怎么办 淘宝订单虚假交易怎么办 被判定虚假物流怎么办 淘宝有虚假交易怎么办 微信辅助不了怎么办 微信验证失败怎么办 淘宝占空间太大怎么办 淘宝占用空间大怎么办 ipad空间不够用怎么办 ipadmini密码忘了怎么办 旧ipad特别卡怎么办 苹果ipad反应慢怎么办 手机垃圾多了怎么办 ipad2内存过低怎么办 苹果平板ipad内存不足怎么办 手机dns配置错误怎么办 蓝牙已停止运行怎么办 ipad看电视闪退怎么办 ipad为什么看电视会闪退怎么办 微淘直播延迟怎么办 手机淘宝进群领金币怎么办 做淘客冲销量停止淘客后怎么办 微信中零钱提现怎么办 淘宝买家不签收怎么办