300英雄的危机(heroes)
时间:2019-10-18
本文章向大家介绍300英雄的危机(heroes),主要包括300英雄的危机(heroes)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
正解与图书馆馆长的考验一致,都是分层图SPFA;
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int row,line,keyn,haha,r; struct typekey{ int x,y; }key[15][20]={0}; struct node{ int to; int nxt; int w; }a[1000000]={0}; int num[1000][1000],fg[1000][1000],kn[15]; int layer,n,m,tot; int head[1000000]; void add(int x,int y,int w) { tot++; a[tot].to=y; a[tot].w=w; a[tot].nxt=head[x]; head[x]=tot; } int dis[1000000],vis[1000000],q[1000000],inf=99999999; void spfa() { int i,j,k,hea,tail; for(i=1;i<=n;i++) dis[i]=inf; dis[1]=0; vis[1]=1; hea=tail=1; q[1]=1; while(hea<=tail) { i=q[hea]; for(k=head[i];k;k=a[k].nxt) { j=a[k].to; if(dis[j]>dis[i]+a[k].w) { dis[j]=dis[i]+a[k].w; if(!vis[j]) { q[++tail]=j; vis[j]=1; } } } vis[i]=0; hea++; } } void build() { int i,j,k,x,y,t; bool havekey[15]={0}; m=row*line; layer=1<<keyn; n=m*layer; for(k=0;k<layer;k++) { for(i=1;i<=keyn;i++) { if(k&(1<<(i-1))) havekey[i]=1; else havekey[i]=0; } for(i=1;i<=row;i++) { for(j=1;j<=line;j++) { x=num[i][j]; y=num[i][j+1]; if(y!=0&&fg[x][y]!=-1) { if(fg[x][y]==0||havekey[fg[x][y]]) { add(k*m+x,k*m+y,1); add(k*m+y,k*m+x,1); //cout<<k*m+x<<" "<<k*m+y<<" "<<k*m+y<<" "<<k*m+x<<endl; } } y=num[i+1][j]; if(y!=0&&fg[x][y]!=-1) { if(fg[x][y]==0||havekey[fg[x][y]]) { add(k*m+x,k*m+y,1); add(k*m+y,k*m+x,1); //cout<<k*m+x<<" "<<k*m+y<<" "<<k*m+y<<" "<<k*m+x<<endl; } } } } for(i=1;i<=keyn;i++) { if(!havekey[i]) { t=k+(1<<(i-1)); for(j=1;j<=kn[i];j++) { x=num[key[i][j].x][key[i][j].y]; add(k*m+x,t*m+x,0); //cout<<k*m+x<<" "<<t*m+y<<endl; } } } } } void read() { int i,j,k,x,y,p; cin>>row>>line>>keyn>>haha; k=0; for(int i=1;i<=row;i++) { for(int j=1;j<=line;j++) { num[i][j]=++k; } } cin>>r; for(int i=1;i<=r;i++) { scanf("%d%d",&x,&y);j=num[x][y]; scanf("%d%d",&x,&y);k=num[x][y]; scanf("%d",&p); if(p==0) p=-1; fg[j][k]=fg[k][j]=p; } scanf("%d",&r); for(int i=1;i<=r;i++) { scanf("%d%d%d",&x,&y,&p); kn[p]++; key[p][kn[p]].x=x; key[p][kn[p]].y=y; } } int main() { memset(fg,0,sizeof(fg)); read(); build(); spfa(); int ans=inf; for(int i=0;i<layer;i++) { ans=min(ans,dis[i*m+num[row][line]]); } if(ans!=inf) { if(ans<=haha) cout<<ans<<endl; else cout<<(ans-haha)*2+haha; } else cout<<char(92)<<" Oh,no! Tita will die /"; }
原文地址:https://www.cnblogs.com/kamimxr/p/11700417.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Windows10安装JDK14
- IDEA 配置 maven 完美解决方案
- 06 Spring Boot 整合Shrio
- List集合转化为数组
- 小心,99%的面试者,都倒在了这里。一文带你了解spring全家桶
- 阿里P9整理Java 高频面试题聊一聊 JUC 下的 LinkedBlockingQueue
- Java环境配置
- 一次django内存异常排查
- Hystrix服务降级-服务熔断
- 自定义值类型一定不要忘了重写Equals,否则性能和空间双双堪忧
- brk实现
- MapReduce之WritableComparable排序
- MapReduce之Combiner合并
- 05 Spring Boot 整合Spring Security
- 无分类编址 CIDR(构造超网)