传送门

和网络流有半毛钱关系么……

可以发现$n,m,p$都特别小,那么考虑状压,每一个状态表示位置以及钥匙的拥有情况,然后每次因为只能走一步,所以可以用bfs求出最优解

然后是某大佬说的注意点:每个点可以有很多钥匙,而且初始点也有可能有钥匙

 //minamoto
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=;
int vis[N][N][(<<N)],map[N][N][N][N],pas[N][N][N],num[N][N];
struct node{
int x,y,step,now;
node(){}
node(int x,int y,int step,int now):x(x),y(y),step(step),now(now){}
};
queue<node> q;
int dx[]={,,,-},dy[]={,-,,};
int n,m,p,k;
int bfs(){
int now=;
for(int i=;i<=num[][];++i)
now|=(<<(pas[][][i]-));
vis[][][now]=;
q.push(node(,,,now));
while(!q.empty()){
node u=q.front();q.pop();
if(u.x==n&&u.y==m) return u.step;
for(int i=;i<;++i){
int xx=u.x+dx[i],yy=u.y+dy[i],t;
if(xx<||xx>n||yy<||yy>m) continue;
if(map[u.x][u.y][xx][yy]==-) continue;
if((t=map[u.x][u.y][xx][yy]))
if(!(u.now&(<<(t-)))) continue;
int nowx=u.now;
for(int j=;j<=num[xx][yy];++j)
nowx|=(<<(pas[xx][yy][j]-));
if(vis[xx][yy][nowx]) continue;
vis[xx][yy][nowx]=;
q.push(node(xx,yy,u.step+,nowx));
}
}
return -;
}
int main(){
n=read(),m=read(),p=read(),k=read();
for(int i=;i<=k;++i){
int x1,x2,y1,y2,g;
x1=read(),y1=read(),x2=read(),y2=read(),g=read();
if(g==) map[x1][y1][x2][y2]=map[x2][y2][x1][y1]=-;
else map[x1][y1][x2][y2]=map[x2][y2][x1][y1]=g;
}
int s=read();
for(int i=;i<=s;++i){
int x=read(),y=read(),p=read();
pas[x][y][++num[x][y]]=p;
}
printf("%d\n",bfs());
return ;
}

最新文章

  1. js判断图片是否加载完成
  2. Fragment中添加ListView而不使用ListFragment
  3. AIX系统的环境变量设置
  4. jodaTime 的使用说明
  5. java FileWriter and FileReader
  6. 浏览器获取ip地址
  7. 【网摘】DICOM 基础简介
  8. contenteditable 属性
  9. LeetCode_Unique Binary Search Trees II
  10. 关于asp.net简单的下载问题
  11. MongoDB基本命令行操作
  12. [Spark内核] 第38课:BlockManager架构原理、运行流程图和源码解密
  13. C#在PDF中如何以不同颜色高亮文本
  14. SprintBoot的@ComponentScan“踩坑”
  15. 【WEB】带边框的网页页面实现
  16. GIT的初级使用
  17. 【BZOJ4408】[FJOI2016]神秘数(主席树)
  18. [20171106]修改show spparameter的显示宽度.txt
  19. Python 八大排序算法速度比较
  20. 输出前n大的数(分治)

热门文章

  1. 10-EasyNetQ之控制队列名称
  2. 接口测试中如何利用cookies保持会话
  3. IE6的checkbox, radio是通过defaultChecked决定是否选中
  4. web界面上的字体兼容方案
  5. JUNIT的用法简要总结
  6. PrimeNG01 angular集成PrimeNG
  7. Docker学习笔记_Dockerfile常用指令
  8. Nginx 模块开发
  9. 数据库连接池DBUtils
  10. scala的futue和promise