洛谷P4011 孤岛营救问题(状压+BFS)
2018-08-19 11:12
344 查看
传送门
和网络流有半毛钱关系么……
可以发现$n,m,p$都特别小,那么考虑状压,每一个状态表示位置以及钥匙的拥有情况,然后每次因为只能走一步,所以可以用bfs求出最优解
然后是某大佬说的注意点:每个点可以有很多钥匙,而且初始点也有可能有钥匙
和网络流有半毛钱关系么……
可以发现$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[1<<21],*p1=buf,*p2=buf; inline int read(){ #define num ch-'0' char ch;bool flag=0;int res; while(!isdigit(ch=getc())) (ch=='-')&&(flag=true); for(res=num;isdigit(ch=getc());res=res*10+num); (flag)&&(res=-res); #undef num return res; } const int N=11; int vis [(1<<N)],map ,pas ,num ; 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[]={0,0,1,-1},dy[]={1,-1,0,0}; int n,m,p,k; int bfs(){ int now=0; for(int i=1;i<=num[1][1];++i) now|=(1<<(pas[1][1][i]-1)); vis[1][1][now]=1; q.push(node(1,1,0,now)); while(!q.empty()){ node u=q.front();q.pop(); if(u.x==n&&u.y==m) return u.step; for(int i=0;i<4;++i){ int xx=u.x+dx[i],yy=u.y+dy[i],t; if(xx<1||xx>n||yy<1||yy>m) continue; if(map[u.x][u.y][xx][yy]==-1) continue; if((t=map[u.x][u.y][xx][yy])) if(!(u.now&(1<<(t-1)))) continue; int nowx=u.now; for(int j=1;j<=num[xx][yy];++j) nowx|=(1<<(pas[xx][yy][j]-1)); if(vis[xx][yy][nowx]) continue; vis[xx][yy][nowx]=1; q.push(node(xx,yy,u.step+1,nowx)); } } return -1; } int main(){ n=read(),m=read(),p=read(),k=read(); for(int i=1;i<=k;++i){ int x1,x2,y1,y2,g; x1=read(),y1=read(),x2=read(),y2=read(),g=read(); if(g==0) map[x1][y1][x2][y2]=map[x2][y2][x1][y1]=-1; else map[x1][y1][x2][y2]=map[x2][y2][x1][y1]=g; } int s=read(); for(int i=1;i<=s;++i){ int x=read(),y=read(),p=read(); pas[x][y][++num[x][y]]=p; } printf("%d\n",bfs()); return 0; }
相关文章推荐
- 洛谷 P4011 孤岛营救问题【bfs】
- 洛谷P4011:孤岛营救
- 洛谷 2831 [NOIP2016] 愤怒的小鸟 状压bfs
- poj 迷宫问题(路径记录)(DFS,BFS)
- 洛谷 P2754 星际转移问题【网络流24题】【枚举答案+动态加边最大流】
- 笔试题--推箱子问题(BFS算法)
- BFS求解迷宫问题初探(java版)
- POJ3984 迷宫问题【BFS】
- NYU AI作业习题-活动安排问题 BFS+DFS Iterative deepening depth-first search
- 洛谷P1439 排列LCS问题
- BZOJ1229 & 洛谷2917:[USACO2008 NOV]toy 玩具 & 洛谷4480:[BJWC2018]餐巾计划问题——题解
- 洛谷 P2754 星际转移问题【最大流】
- 洛谷 P2756 飞行员配对方案问题
- hdu 1495 非常可乐 BFS+倒水问题
- 洛谷P4016:负载平衡问题
- Children of the Candy Corn(搜索方向变化问题)(bfs)(dfs)
- 洛谷 P1023 税收与补贴问题 (2000NOIP提高组)
- 华容道 洛谷1979 bfs+spfa
- ACM之八数码问题----BFS搜索----数独游戏的模拟(下)
- K - 迷宫问题 POJ 3984 BFS路径输出