[网络流24题]孤岛营救问题
分析
网络流24题总结
这题直接状压BFS也可以,不过可以把BFS改成SPFA,进一步优化
显然要维护三个状态:s,x,y,分别表示钥匙状态s(用一个二进制表示,第i位为1表示当前有第i个钥匙),和当前的x,y坐标,以这三个状态来分层
那么设dist(s,x,y)表示到达当前状态的最短时间
转移就跟BFS的转移一样,除了判断条件里要加关于dist的判断,详见代码
代码
最短路:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<bitset>
#define maxn 15
#define INF 0x3f3f3f3f
using namespace std;
struct node{int x;int y;int k;node(){}node(int xx,int yy,int key){x=xx;y=yy;k=key;}
};
int n,m,p,k,s;
int dist[2505][maxn][maxn];
int inq[2505][maxn][maxn];
int key[maxn][maxn];
int door[maxn][maxn][maxn][maxn];
const int walkx[4]={1,-1,0,0};
const int walky[4]={0,0,1,-1};
int spfa(){queue<node>q;q.push(node(1,1,key[1][1]));inq[key[1][1]][1][1]=1;memset(dist,0x3f,sizeof(dist)); dist[key[1][1]][1][1]=0;while(!q.empty()){node now=q.front();q.pop();inq[now.k][now.x][now.y]=0;for(int i=0;i<4;i++){int x=now.x+walkx[i];int y=now.y+walky[i];if(x>=1&&x<=n&&y>=1&&y<=m){ if((door[now.x][now.y][x][y]>=1 && (now.k & (1<<door[now.x][now.y][x][y])) !=0)||door[now.x][now.y][x][y]==-1){if(dist[now.k|key[x][y]][x][y]>dist[now.k][now.x][now.y]+1){dist[now.k|key[x][y]][x][y]=dist[now.k][now.x][now.y]+1;if(!inq[now.k|key[x][y]][x][y]){inq[now.k|key[x][y]][x][y]=1;q.push(node(x,y,now.k|key[x][y]));} } }} }}int ans=INF;for(int i=0;i<(1<<(p+1));i++){ans=min(ans,dist[i][n][m]);}if(ans==INF) return -1;else return ans;
}int main(){int x1,y1,x2,y2,g;scanf("%d %d %d",&n,&m,&p);scanf("%d",&k);memset(door,0xff,sizeof(door));for(int i=1;i<=k;i++){scanf("%d %d %d %d %d",&x1,&y1,&x2,&y2,&g);door[x1][y1][x2][y2]=g; door[x2][y2][x1][y1]=g;}scanf("%d",&s);for(int i=1;i<=s;i++){scanf("%d %d %d",&x1,&y1,&g);key[x1][y1]|=(1<<g);}printf("%d\n",spfa());
}
状压BFS:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<bitset>
#define maxn 15
using namespace std;
struct node{int x;int y;int k;int t;node(){}node(int xx,int yy,int key,int tim){x=xx;y=yy;k=key;t=tim;}void debug(){printf("(%d,%d) tim=%d ",x,y,t);cout <<"key="<<bitset<10>(k)<<endl;}
};
int n,m,p,k,s;
int vis[2005][maxn][maxn];
int key[maxn][maxn];
int door[maxn][maxn][maxn][maxn];
const int walkx[4]={1,-1,0,0};
const int walky[4]={0,0,1,-1};
int bfs(){queue<node>q;q.push(node(1,1,key[1][1],0));vis[key[1][1]][1][1]=1;while(!q.empty()){node now=q.front();q.pop();
// now.debug();if(now.x==n&&now.y==m){return now.t;} for(int i=0;i<4;i++){int x=now.x+walkx[i];int y=now.y+walky[i];if(x>=1&&x<=n&&y>=1&&y<=m){ if(door[now.x][now.y][x][y]==0) continue;if((door[now.x][now.y][x][y]>=1 && (now.k & (1<<door[now.x][now.y][x][y])) !=0)||door[now.x][now.y][x][y]==-1){if(vis[now.k|key[x][y]][x][y]) continue;vis[now.k|key[x][y]][x][y]=1;q.push(node(x,y,now.k|key[x][y],now.t+1)); }} }}return -1;
}int main(){int x1,y1,x2,y2,g;scanf("%d %d %d",&n,&m,&p);scanf("%d",&k);memset(door,0xff,sizeof(door));for(int i=1;i<=k;i++){scanf("%d %d %d %d %d",&x1,&y1,&x2,&y2,&g);door[x1][y1][x2][y2]=g; door[x2][y2][x1][y1]=g;}scanf("%d",&s);for(int i=1;i<=s;i++){scanf("%d %d %d",&x1,&y1,&g);key[x1][y1]|=(1<<g);}printf("%d\n",bfs());
}
转载于:https://www.cnblogs.com/birchtree/p/10602837.html
[网络流24题]孤岛营救问题相关推荐
- 【线性规划与网络流24题】孤岛营救问题 分层图
孤岛营救问题 Time Limit: 1 Sec Memory Limit: 128 MB Description 1944年,特种兵麦克接到国防部的命令.要求马上赶赴太平洋上的一个孤岛,营救被敌军 ...
- [网络流24题-6]孤岛营救问题
孤岛营救问题 为什么又是奇奇怪怪的混进来的题啊QAQ 又没想出网络流解法啊QAQ 看见P是10就又状压了吖QwQ bfs跑一遍就吼了w 为啥子网络流24题总是状压+最短路/bfs啊QAQ 哦对记得门和 ...
- 解题报告:线性规划与网络流24题
目录 A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] C.最小路径覆盖问题(有向无环图最小路 ...
- 「网络流24题」 题目列表
「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分 ...
- 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)
------------------------------------------------------------------------------------ 17/24 --------- ...
- 【题解】网络流24题一句话题解集合
最近写了下<线性规划与网络流24题>,发下代码和题解,事实上就是将交给cycycy的题解复制一下 T1 飞行员配对方案问题 solution 裸的匈牙利 code #include< ...
- cwl的网络流24题练习
网络流24题 编号 题目 备注 1 飞行员配对方案问题 二分图最大匹配,可最大流解决 2 太空飞行计划问题 3 最小路径覆盖问题 有向图最小路径覆盖,解法都写题目上了 4 魔术球问题 有向图最 ...
- 「网络流24题」 12. 软件补丁问题
「网络流24题」 12. 软件补丁问题 状压 DP,SPFA 转移. 没错,跟网络流没任何关系. b1.b2.f1.f2 都用二进制存下来,第 i 位表示是否有这个错误. 然后从每位都是 1 到 0 ...
- loj #6226. 「网络流 24 题」骑士共存问题
#6226. 「网络流 24 题」骑士共存问题 题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些 ...
最新文章
- R语言使用caret包构建岭回归模型(Ridge Regression )构建回归模型、通过method参数指定算法名称、通过trainControl函数控制训练过程
- java 多行文本框_Spring MVC-表单(Form)标签-多行文本框(TextArea)示例(转载实践)...
- 【搜遍互联网,集百家之长】环境配置从入门到放弃之Mac环境下,安装XAMPP,给phpstorm安装Xdebug调试工具...
- Python入门100题 | 第070题
- java面试题七 char转int
- js正则表达式之人民币匹配
- Jetson Nano安装pytorch 基于torch1.6和torchvision0.7
- 数字逻辑电路中逻辑门的符号_数字计算机中使用的逻辑门
- 痞子衡嵌入式:MCUXpresso Config Tools初体验(Pins, Clocks, Peripherals)
- Java 读取jpeg图片 Unsupported Image Type 异常
- 使用Jmeter对华为私有云进行性能测试
- 更换移动硬盘显示图标
- 超低功耗离线智能语音识别芯片AT6811
- 哔咔官网打不开显示黑屏?
- c语言完美素数反思,《素数和合数》优秀教学反思
- 使用GI Agent(XAG)实现GoldenGate的高可用性(一)
- H3C无线控制器支持的认证方式
- echarts-map 地图打点小案例
- DolphinScheduler技术分析(十)
- 关于maven依赖死活都下载不了终极解决方案
热门文章
- python_集合(set)
- Windows 10 使用问题
- SSHnbsp;整合-nbsp;6nbsp;-nbsp;service_serviceImp…
- Fragment的生命周期同一Activity下不同Fragment之间的通信
- 关于Delphi XE2的FMX的一点点研究之消息篇
- LeetCode(1021)——删除最外层的括号(JavaScript)
- Linux---网络编程基础
- JavaScript学习(七十六)—this的指向问题
- USB 3.1 与 Type-C 接口有什么关系呢
- 坐异性朋友的车时,能坐在副驾驶吗?