bzoj2763[JLOI2011]飞行路线

bzoj2763[JLOI2011]飞行路线

题意:

n个城市,这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市(双向),并且航线有一定的价格,途中可以进行转机。规定可以免费在最多k种航线上搭乘飞机。已知起点终点和k,求这次出行最少花费多少?

题解:

同上,但这次乱搞会TLE,本弱太弱了!

代码:

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <queue>
 5 #define INF 0x3fffffff
 6 #define inc(i,j,k) for(int i=j;i<=k;i++)
 7 #define turn(x,y) (y-1)*n+x
 8 using namespace std;
 9 
10 struct e{int t,w,n;}; int ess,g[15000]; e es[200000];
11 void pe(int f,int t,int w){es[++ess]=(e){t,w,g[f]}; g[f]=ess;}
12 int n,m,k,s,t,d[15000][11]; bool inq[15000][11];
13 struct nd{int x,y;}; queue <nd> q;
14 void spfa(){
15     while(! q.empty())q.pop(); inc(i,0,n-1)inc(j,1,k+1)d[i][j]=INF;
16     d[s][1]=0; q.push((nd){s,1}); inq[s][1]=1;
17     while(! q.empty()){
18         nd x=q.front(); q.pop(); inq[x.x][x.y]=0;
19         for(int i=g[x.x];i;i=es[i].n)if(d[es[i].t][x.y]>d[x.x][x.y]+es[i].w){
20             d[es[i].t][x.y]=d[x.x][x.y]+es[i].w; if(! inq[es[i].t][x.y])q.push((nd){es[i].t,x.y}),inq[es[i].t][x.y]=1;
21         }
22         if(x.y<=k)for(int i=g[x.x];i;i=es[i].n)if(d[es[i].t][x.y+1]>d[x.x][x.y]){
23             d[es[i].t][x.y+1]=d[x.x][x.y]; if(! inq[es[i].t][x.y+1])q.push((nd){es[i].t,x.y+1}),inq[es[i].t][x.y+1]=1;
24         }
25     }
26 }
27 int main(){
28     scanf("%d%d%d%d%d",&n,&m,&k,&s,&t); ess=0; memset(g,0,sizeof(g));
29     inc(i,1,m){
30         int a,b,c;scanf("%d%d%d",&a,&b,&c); pe(a,b,c),pe(b,a,c);
31     }
32     spfa(); int min=INF;
33     inc(i,1,k+1)if(d[t][i]<min)min=d[t][i];
34     printf("%d",min);
35     return 0;    
36 }

 

20160406

转载于:https://www.cnblogs.com/YuanZiming/p/5693146.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值