正题

jzoj题目链接:https://jzoj.net/senior/#main/show/5309


题目大意

有n个点,m条边,k种钥匙。有些点分布了钥匙,有些边需要一些钥匙才可以通过,求1到n的最短路。


解题思路

将图分成2k2k2^k层,每一层用二进制表示不同的钥匙情况。然后根据不同情况连边就好了。
(双端队列bfs会莫名其妙WA一个点)


code

#include<cstdio>
#include<queue>
#include<cstring>
#define p(x,y) x*n+y
#define N 5110
#define M 6110
#define MS 1024
using namespace std;
struct node{int to,next;bool w;
}a[MS*(N+M)];
int n,m,k,x,y,w,MAX_State,d[N*MS],tot,ls[N*MS];
bool v[N*MS];
queue<int> q;
void addl(int x,int y,int w)//加边
{a[++tot].to=y;a[tot].next=ls[x];a[tot].w=w;ls[x]=tot;
}
void bfs()//SPFA
{memset(d,127/3,sizeof(d));q.push(p(0,1));d[p(0,1)]=0;v[p(0,1)]=1;while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(d[x]+a[i].w<d[y]){d[y]=d[x]+a[i].w;if(!v[y]){v[y]=true;q.push(y);}}}v[x]=false;}
}
int main()
{scanf("%d%d%d",&n,&m,&k);MAX_State=1<<k;for(int i=1;i<=n;i++)for(int j=1;j<=k;j++){scanf("%d",&x);if(x){for(int state=0;state<MAX_State;state++)addl(p(state,i),p((state|(1<<(j-1))),i),0);//不同情况的获取钥匙}}for(int i=1;i<=m;i++){int state=0;scanf("%d%d",&x,&y);for(int i=1;i<=k;i++){scanf("%d",&w);state+=w<<(i-1);}for(int j=0;j<MAX_State;j++)if((j&state)==state)addl(p(j,x),p(j,y),1);//满足钥匙的情况连边}bfs();int ans;ans=2147483647;for(int j=0;j<MAX_State;j++)ans=min(ans,d[p(j,n)]);//因为没有要求钥匙状态所以取最小的if(ans>10000) printf("No Solution");else printf("%d",ans);
}

nssl1150,jzoj5309-密室【分层建图,SPFA】相关推荐

  1. 小雨坐地铁--[最短路分层建图+虚点]

    也是第一次接触这种分层建图的最短路 思路:由题目我们可以知道某些站点是可以连接好几条地铁线路的,那么对于每条地铁线路我们可以把他当成一幅图来算.当然图是个无向图,所以要加两次边. add(i*n+x, ...

  2. CF-346 D. Robot Control(反向建图spfa)

    CF-346 D. Robot Control(反向建图spfa) 题目链接 题意 有向图(有环)中有一个机器人,机器人有三种规则: 重复访问同一个点会自我销毁 无路可走会自我销毁 多岔路口会随机选择 ...

  3. vijos1404 遭遇战(建图spfa)

    这回要自己建图了..首先为了能连上,我们把[1,3]这种区间改记成[1,4).在图上用一条1指向4的有向边代替,边权为cost.然后为了解决覆盖的问题,即[1,3],[2,5]这种也可以满足[1,5] ...

  4. POJ 2312Battle City(BFS-priority_queue 或者是建图spfa)

    1 /* 2 bfs搜索!要注意的是点与点的权值是不一样的哦! 3 空地到空地的步数是1, 空地到墙的步数是2(轰一炮+移过去) 4 所以用到优先队列进行对当前节点步数的更新! 5 */ 6 #inc ...

  5. Invitation Cards POJ - 1511 SPFA(dijkstra+反向建图+邻接表(下标过大)+输入输出用stdio(iostream超时))

    题目大意: 有编号1-P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接 到达终点站,是单向的,每条路线有它自己的车费.有P个人早上从1出发 ,他们要到达每一个公交站点, 然后到了晚上再返回点 ...

  6. TANDEM 基于深度多视图立体视觉的实时跟踪和稠密建图

    点云PCL免费知识星球,点云论文速读. 文章:TANDEM: Tracking and Dense Mapping in Real-time using Deep Multi-view Stereo ...

  7. 面向固态激光雷达和惯导的里程计和建图

    点云PCL免费知识星球,点云论文速读. 文章:Towards High-Performance Solid-State-LiDAR-Inertial Odometry and Mapping 作者:K ...

  8. 差分约束问题 ---- 2019ccpc哈尔滨A. Artful Paintings[二分+差分约束+建图剪枝]

    题目链接 题目大意: 有N≤3e3N≤3e3N≤3e3个格子,你可以任意给每个格子染色,但是要满足M≤3e3M≤3e3M≤3e3限制条件,限制条件有两种类型: 区间[l,r][l,r][l,r]中被染 ...

  9. 解题报告:NOIP2013 车站分级(拓扑序递推求解差分约束、建图优化O(n+m)) 超详细讲解

    本题是2013年NOIP普及组的压轴题 差分约束裸题. 计算当前线路中最小的级别(比较始发站和终点站). 整条线路中所有大于这个级别的都必须停靠 所有未停靠的站点的级别一定小于这个级别 也就是说所有未 ...

最新文章

  1. Ubuntu20.4安装及配置mysql详细教程
  2. 【机器学习】这次终于彻底理解了奇异值分解(SVD)原理及应用
  3. 【PyTorch】torch.clamp()==>将input的值限制在[min, max]之间,并返回结果到一个新张量
  4. IT餐馆—第四回 离职
  5. 2017.4.16 幂次方 思考记录
  6. 前端开发和设计必备的Chrome插件
  7. SQL tp3.2 批量更新 saveAll
  8. HKC PG27P3Q 评测
  9. 送一台高配电脑,吃鸡贼爽!
  10. 数据挖掘十大经典算法笔记
  11. 计算机CPU工作(多核/缓存)原理
  12. Linux7/Centos7磁盘分区、格式化及LVM管理
  13. eclipse MAVEN插件正确使用方式。
  14. 是不是太胖了(C语言)
  15. C++ STL源码分析——一个万用的 hash function
  16. 科技云报道:混合云起势,青云QingCloud领跑
  17. 面试感悟----一名3年工作经验的程序员应该具备的技能,对于一些入门或者还在面试阶段的人有着很大的启发...
  18. 亚洲房地产投资信托基金(REITs)研究报告——附下载链接
  19. js修改身份证,手机号码为****的方法
  20. 固态硬盘和机械硬盘的比较和SQLSERVER在两种硬盘上的性能差异

热门文章

  1. mysql connector c编程_MySQL数据库之MySQL Connector 编程
  2. mysql 命令 g_MySQL命令行的几个用法
  3. php defunct,通过swoole观察僵尸进程和孤儿进程出现和消亡
  4. qtabwidget设置tab高度_VC|富文本编辑框CRichEditCtrl的字体与段落设置
  5. python根据列表绘制柱状图_python把一个列表画柱状图
  6. [RabbitMQ]MQ 的分类
  7. [Java基础]内部类基础
  8. C++实现线段树求区间和-区间查询
  9. [蓝桥杯][算法提高VIP]开灯游戏-dfs
  10. Largest Rectangle in a Histogram (动态规划+奇思妙想单调栈)求最大矩状图面积