分析

网络流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题]孤岛营救问题相关推荐

  1. 【线性规划与网络流24题】孤岛营救问题 分层图

    孤岛营救问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 1944年,特种兵麦克接到国防部的命令.要求马上赶赴太平洋上的一个孤岛,营救被敌军 ...

  2. [网络流24题-6]孤岛营救问题

    孤岛营救问题 为什么又是奇奇怪怪的混进来的题啊QAQ 又没想出网络流解法啊QAQ 看见P是10就又状压了吖QwQ bfs跑一遍就吼了w 为啥子网络流24题总是状压+最短路/bfs啊QAQ 哦对记得门和 ...

  3. 解题报告:线性规划与网络流24题

    目录 A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] C.最小路径覆盖问题(有向无环图最小路 ...

  4. 「网络流24题」 题目列表

    「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分 ...

  5. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)

    ------------------------------------------------------------------------------------ 17/24 --------- ...

  6. 【题解】网络流24题一句话题解集合

    最近写了下<线性规划与网络流24题>,发下代码和题解,事实上就是将交给cycycy的题解复制一下 T1 飞行员配对方案问题 solution 裸的匈牙利 code #include< ...

  7. cwl的网络流24题练习

    网络流24题 编号 题目 备注 1 飞行员配对方案问题 二分图最大匹配,可最大流解决 2 太空飞行计划问题   3 最小路径覆盖问题  有向图最小路径覆盖,解法都写题目上了 4 魔术球问题  有向图最 ...

  8. 「网络流24题」 12. 软件补丁问题

    「网络流24题」 12. 软件补丁问题 状压 DP,SPFA 转移. 没错,跟网络流没任何关系. b1.b2.f1.f2 都用二进制存下来,第 i 位表示是否有这个错误. 然后从每位都是 1 到 0 ...

  9. loj #6226. 「网络流 24 题」骑士共存问题

    #6226. 「网络流 24 题」骑士共存问题 题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些 ...

最新文章

  1. R语言使用caret包构建岭回归模型(Ridge Regression )构建回归模型、通过method参数指定算法名称、通过trainControl函数控制训练过程
  2. java 多行文本框_Spring MVC-表单(Form)标签-多行文本框(TextArea)示例(转载实践)...
  3. 【搜遍互联网,集百家之长】环境配置从入门到放弃之Mac环境下,安装XAMPP,给phpstorm安装Xdebug调试工具...
  4. Python入门100题 | 第070题
  5. java面试题七 char转int
  6. js正则表达式之人民币匹配
  7. Jetson Nano安装pytorch 基于torch1.6和torchvision0.7
  8. 数字逻辑电路中逻辑门的符号_数字计算机中使用的逻辑门
  9. 痞子衡嵌入式:MCUXpresso Config Tools初体验(Pins, Clocks, Peripherals)
  10. Java 读取jpeg图片 Unsupported Image Type 异常
  11. 使用Jmeter对华为私有云进行性能测试
  12. 更换移动硬盘显示图标
  13. 超低功耗离线智能语音识别芯片AT6811
  14. 哔咔官网打不开显示黑屏?
  15. c语言完美素数反思,《素数和合数》优秀教学反思
  16. 使用GI Agent(XAG)实现GoldenGate的高可用性(一)
  17. H3C无线控制器支持的认证方式
  18. echarts-map 地图打点小案例
  19. DolphinScheduler技术分析(十)
  20. 关于maven依赖死活都下载不了终极解决方案

热门文章

  1. python_集合(set)
  2. Windows 10 使用问题
  3. SSHnbsp;整合-nbsp;6nbsp;-nbsp;service_serviceImp…
  4. Fragment的生命周期同一Activity下不同Fragment之间的通信
  5. 关于Delphi XE2的FMX的一点点研究之消息篇
  6. LeetCode(1021)——删除最外层的括号(JavaScript)
  7. Linux---网络编程基础
  8. JavaScript学习(七十六)—this的指向问题
  9. USB 3.1 与 Type-C 接口有什么关系呢
  10. 坐异性朋友的车时,能坐在副驾驶吗?