博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nssl1255-B(轻功)【SPFA,分层图】
阅读量:2023 次
发布时间:2019-04-28

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

正题


题目大意

有k中轻功,n个木桩,每种轻功可以消耗 w i   s w_i\ s wi s飞过 a i a_i ai个木桩,有些木桩有不可以被某种轻功飞过的限制,然后切换一次轻功要 W   s W\ s W s


解题思路

将图分成 k k k层,每层表示在不同的轻功状态,然后根据提议建图就好了。


code

#include
#include
#include
#include
#include
#define K 210#define N 510#define p(x,y) (x-1)*n+yusing namespace std;struct node{
int to,w,next;}a[N*K*K+N*K];vector
no[N];queue
q;int n,tot,W,ar[K],w[K],ls[N*K],f[N*K],k,x,y,Q;bool v[N*K];void addl(int x,int y,int w){ a[++tot].to=y;a[tot].w=w; a[tot].next=ls[x];ls[x]=tot;}void spfa()//SPFA{ memset(f,127/3,sizeof(f)); for(int i=1;i<=k;i++) q.push(p(i,1)),f[p(i,1)]=0,v[p(i,1)]=1; while(!q.empty()) { int x=q.front(); q.pop();v[x]=0; for(int i=ls[x];i;i=a[i].next) { int y=a[i].to; if(f[x]+a[i].w
no[i][now]) now++; if(now
<=j+ar[i]) continue; addl(p(i,j),p(i,j+ar[i]),w[i]); } } for(int ki=1;ki<=n;ki++) for(int i=1;i<=k;i++) for(int j=1;j<=k;j++) if(i!=j) addl(p(i,ki),p(j,ki),W); spfa(); int ans=2147483647; for(int i=1;i<=k;i++) ans=min(ans,f[p(i,n)]); if(ans>2147483647/4) printf("-1"); else printf("%d",ans);}

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

你可能感兴趣的文章
针对fork()函数的深入理解!用事例family家谱来进行说明!
查看>>
被调用的linux系统函数system的是如何实现的!
查看>>
利用linux下的c语言编程来简单的实现一个shell功能实现!
查看>>
Linux下c编程系统函数调用Signal信号的介绍
查看>>
linux内核介绍之系统调用过程
查看>>
linux内核介绍之开机启动过程
查看>>
linux下c编程之信号量semget,semop,semctl函数
查看>>
linux下c编程之内存共享shemget函数的实现及案例-bmi体重身高测试2
查看>>
linux下c编程之内存共享shemget函数的实现及案例-bmi体重身高测试1
查看>>
linux下c编程之无名管道pipe()函数
查看>>
linux下c编程系统调用之有名管道FIFO函数的使用及案例
查看>>
linux下c编程系统函数调用之信息队列
查看>>
dl动态链接文件函数
查看>>
enum枚举介绍
查看>>
<dlfcn.h>
查看>>
线程函数pthread_cleanup_push()
查看>>
什么是博士?
查看>>
高效编程的秘诀
查看>>
如何找到研究点
查看>>
开源的Web开发资源
查看>>