博客
关于我
【分层图最短路】P4568 [JLOI2011]飞行路线
阅读量:284 次
发布时间:2019-03-03

本文共 1389 字,大约阅读时间需要 4 分钟。

将免费乘坐的机会看做两个层之间的边,对于读入的每天一条边,都再k层内建边,以及跨层建边

然后就可以跑dijkstra

注意:最后的答案可能不在dis[t+k*n]上,因为最优解可能没有使用k次免费的机会,所以需要统计一下每层t位置的dis值,取最小即可

 

代码

#include
using namespace std;const int maxn=5e6+5;int n,m,k,s,t;int dis[maxn],vis[maxn],head[maxn],tot;struct edge{ int to,nxt,v;}e[maxn<<1];int read(){ char cc=getchar(); int x=0,f=1; while((cc<'0' || cc>'9') && cc!='-') cc=getchar(); if(cc=='-') f=-1,cc=getchar(); while(cc>='0' && cc<='9') { x=x*10+cc-'0'; cc=getchar(); } return x*f;}void add(int x,int y,int z){ e[++tot].nxt=head[x]; e[tot].to=y; e[tot].v=z; head[x]=tot;}priority_queue
,vector
> ,greater
> > q;void dijkstra(int x){ memset(dis,0x3f,sizeof(dis)); dis[x]=0; q.push(make_pair(0,s)); while(!q.empty()) { int u=q.top().second; q.pop(); if(!vis[u]) { vis[u]=1; for(int i=head[u];i;i=e[i].nxt) { int to=e[i].to; int v=e[i].v; if(dis[to]>dis[u]+v) { dis[to]=dis[u]+v; q.push(make_pair(dis[to],to)); } } } }}int main(){ freopen("a.in","r",stdin); freopen("a.out","w",stdout); n=read(); m=read(); k=read(); s=read(); t=read(); for(int i=1;i<=m;i++) { int x,y,z; x=read(); y=read(); z=read(); add(x,y,z); add(y,x,z); for(int j=1;j<=k;j++) { add(x+n*(j-1),y+n*j,0); add(y+n*(j-1),x+n*j,0); add(x+j*n,y+n*j,z); add(y+j*n,x+n*j,z); } } dijkstra(s); int ans=0x3f3f3f3f; for(int i=0;i<=k;i++) ans=min(ans,dis[t+i*n]); printf("%d\n",ans); return 0;}

 

转载地址:http://tcwm.baihongyu.com/

你可能感兴趣的文章
fragment中recyclerview的重新加载问题
查看>>
window程序设计(1):第一个windows程序
查看>>
windows程序设计(4):文本输出
查看>>
21.2.3总结
查看>>
线性代数和数学期望杂题
查看>>
21.2.4总结
查看>>
【SSL_P2876】2017年东莞市信息学特长生测试题 工程
查看>>
【洛谷_P1433】吃奶酪
查看>>
赠书和投票 | 你知道中国有哪些Server SAN厂商吗? 投票:你心目最好的HCI品牌是?
查看>>
Base理论介绍
查看>>
volatile关键字和AtomicInteger
查看>>
RedisTemplate中opsForValue()中的方法
查看>>
redisTemplate.opsForHash()
查看>>
循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展
查看>>
maven生命周期
查看>>
方法的绑定机制-静态绑定和动态绑定
查看>>
内核程序和应用程序
查看>>
自动内存管理
查看>>
服务调用
查看>>
Ribbon负载均衡策略
查看>>