博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu-4856 Tunnels 状压DP
阅读量:4679 次
发布时间:2019-06-09

本文共 1444 字,大约阅读时间需要 4 分钟。

http://acm.hdu.edu.cn/showproblem.php?pid=4856

有若干管道,每个管道有且只能走一次,而地图可以随意走。

那么可以先处理每个管道间的最短路(不要考虑借助其他管道的情况,因为随后我们用压位的方式可以很轻松地处理不走重复管道的问题,这里不应该引入过多干扰)。

随后我们把每个管道是否访问看作01序列,dp[i][j]看着当前处于j号管道,访问状态为i。然后预先加入当且访问一个管道的m个状态,做bfs即可(很多人做了三重循环,个人不太会那么犀利的操作,只会bfs直观一点hhh,不过两个bfs搞得代码很丑就是了)。

#include 
#include
#include
#include
using namespace std;const int N=1005;const int inf=99999999;int n,m;string mp[20];int vis[20][20];struct p{ int x,y;};p in[20],ou[20];int d[20][20];struct node{ int s; p po;};int dir[4][2]={
1,0,-1,0,0,1,0,-1};bool ok(p px){ if(px.x<0||px.y<0)return 0; if(px.x>=n||px.y>=n)return 0; if(vis[px.y][px.x]) return 0; if(mp[px.y][px.x]=='#')return 0; return 1;}void bfs(int np){ queue
q; node ii; ii.s=0; ii.po=ou[np]; q.push(ii); memset(vis,0,sizeof vis); vis[ii.po.y][ii.po.x]=1; d[np][np]=0; while(!q.empty()) { node now=q.front(); q.pop(); for(int i=0;i
>n>>m) { for(int i=0;i
>mp[i]; for(int i=0;i
>in[i].y>>in[i].x>>ou[i].y>>ou[i].x; in[i].x--; in[i].y--; ou[i].x--; ou[i].y--; } for(int i=0;i
q; int ad=0; for(int i=0;i
dp[now.d][now.po]+d[now.po][nx.po]) { dp[nx.d][nx.po]=dp[now.d][now.po]+d[now.po][nx.po]; q.push(nx); } } } } int ans=inf; for(int i=0;i
=inf)cout<<-1<

 

转载于:https://www.cnblogs.com/LukeStepByStep/p/8351404.html

你可能感兴趣的文章
HEAP CORRUPTION DETECTED
查看>>
Android URI简单介绍
查看>>
蒙板 模态对话框
查看>>
pythong中的全局变量的调用和嵌套函数中变量的使用
查看>>
【POJ - 3009】Curling 2.0 (dfs+回溯)
查看>>
Windows下载安装良心教程
查看>>
浅析商业银行“业务连续性管理体系”的构建
查看>>
【分享】从《水浒传》中反思什么是真正的执行力
查看>>
java中的static
查看>>
5.侧边栏逻辑
查看>>
评论博客
查看>>
用户代理字符串识别工具源码与slf4j日志使用
查看>>
算法导论第6部分图算法,第22章图的基本算法
查看>>
提示框第三方库之MBProgressHUD
查看>>
C语言 10-字符和字符串常用处理函数
查看>>
C++ 表达式语句 海伦的故事
查看>>
32位汇编学习笔记(1)
查看>>
day_01
查看>>
2013年12月日本語能力試験N3聴解部分
查看>>
uva 1349(拆点+最小费用流)
查看>>