hdu-4856 Tunnels 状压DP
http://acm.hdu.edu.cn/showproblem.php?pid=4856
有若干管道,每个管道有且只能走一次,而地图可以随意走。
那么可以先处理每个管道间的最短路(不要考虑借助其他管道的情况,因为随后我们用压位的方式可以很轻松地处理不走重复管道的问题,这里不应该引入过多干扰)。
随后我们把每个管道是否访问看作01序列,dp[i][j]看着当前处于j号管道,访问状态为i。然后预先加入当且访问一个管道的m个状态,做bfs即可(很多人做了三重循环,个人不太会那么犀利的操作,只会bfs直观一点hhh,不过两个bfs搞得代码很丑就是了)。
#include <iostream>
#include <string>
#include <queue>
#include <cstring>
using namespace std;
const int N=;
const int inf=;
int n,m;
string mp[];
int vis[][];
struct p
{
int x,y;
};
p in[],ou[];
int d[][];
struct node
{
int s;
p po;
};
int dir[][]={,,-,,,,,-};
bool ok(p px)
{
if(px.x<||px.y<)return ;
if(px.x>=n||px.y>=n)return ;
if(vis[px.y][px.x]) return ;
if(mp[px.y][px.x]=='#')return ;
return ;
}
void bfs(int np)
{
queue<node> q;
node ii;
ii.s=;
ii.po=ou[np];
q.push(ii);
memset(vis,,sizeof vis);
vis[ii.po.y][ii.po.x]=;
d[np][np]=;
while(!q.empty())
{
node now=q.front();
q.pop();
for(int i=;i<m;i++)
{
if(i==np)continue;
if(now.po.x==in[i].x&&now.po.y==in[i].y)
d[np][i]=now.s;
}
for(int i=;i<;i++)
{
node nx=now;
nx.s++;
nx.po.x+=dir[i][];
nx.po.y+=dir[i][];
if(ok(nx.po))
{
vis[nx.po.y][nx.po.x]=;
q.push(nx);
}
}
}
}
int dp[][];
int numid[];
struct dpx
{
int d;
int po;
dpx(int dd,int pp)
{
d=dd;
po=pp;
}
};
int main()
{
cin.sync_with_stdio(false);
while(cin>>n>>m)
{
for(int i=;i<n;i++)
cin>>mp[i];
for(int i=;i<m;i++)
{
cin>>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=;i<m;i++)
for(int j=;j<m;j++)
d[i][j]=inf;
for(int i=;i<m;i++)
bfs(i);
for(int i=;i<(<<m);i++)
for(int j=;j<m;j++)
dp[i][j]=inf;
int dx=;
queue<dpx> q;
int ad=;
for(int i=;i<m;i++)
{
ad+=dx;
dp[dx][i]=;
numid[i]=dx;
q.push(dpx(dx,i));
dx<<=;
}
while(!q.empty())
{
dpx now=q.front();
q.pop();
for(int i=;i<m;i++)
{
if((now.d&numid[i])==)
{
dpx nx=now;
nx.d+=numid[i];
nx.po=i;
if(dp[nx.d][nx.po]>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=;i<m;i++)
ans=min(ans,dp[(<<m)-][i]);
if(ans>=inf)cout<<-<<endl;
else
cout<<ans<<endl;
}
return ;
}
hdu-4856 Tunnels 状压DP的更多相关文章
- HDU 4284Travel(状压DP)
HDU 4284 Travel 有N个城市,M条边和H个这个人(PP)必须要去的城市,在每个城市里他都必须要“打工”,打工需要花费Di,可以挣到Ci,每条边有一个花费,现在求PP可不可以从起点1 ...
- HDU 4336 容斥原理 || 状压DP
状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示 ...
- HDU 3001 Travelling ——状压DP
[题目分析] 赤裸裸的状压DP. 每个点可以经过两次,问经过所有点的最短路径. 然后写了一发四进制(真是好写) 然后就MLE了. 懒得写hash了. 改成三进制,顺利A掉,时间垫底. [代码] #in ...
- HDU - 5117 Fluorescent(状压dp+思维)
原题链接 题意 有N个灯和M个开关,每个开关控制着一些灯,如果按下某个开关,就会让对应的灯切换状态:问在每个开关按下与否的一共2^m情况下,每种状态下亮灯的个数的立方的和. 思路1.首先注意到N< ...
- hdu 4114(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4114 思路:首先是floyd预处理出任意两点之间的最短距离.dp[state1][state2][u] ...
- hdu 4856 Tunnels 状态压缩dp
Tunnels Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- HDU 3091 - Necklace - [状压DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3091 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- HDU 3811 Permutation 状压dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3811 Permutation Time Limit: 6000/3000 MS (Java/Othe ...
- HDU 5838 (状压DP+容斥)
Problem Mountain 题目大意 给定一张n*m的地图,由 . 和 X 组成.要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的 ...
随机推荐
- GIS优秀博客以及网址收藏,持续更新
1.gislaozhang arcpy,模型构建器,arcpro 地址:https://blog.csdn.net/gislaozhang?t=1 2.雾语 arcpy,模型构建器,arcg ...
- 将lits集合转化为树状结构
一,bean的类型: public class DeptListRES { /** * 子节点 */ private List<DeptListRES> children; private ...
- webpack介绍 安装 常用命令
Webpack是一款用户打包前端模块的工具,它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源.主要是用来打包在浏览器端使用的javascript的.同时也能转换.捆绑 ...
- 《Mysql 用户管理》
一:数据库用户 ROOT 和 其他用户有什么区别么? - Mysql root 和 linux root 不是一回事,数据库 root 只不过是初始化时候自己建立的一个用户而已,随时可以删除/修改. ...
- linux之tail和head的使用
tail 基本介绍 用于显示文件的结尾的内容.在默认情况下,taild命令显示文件的后10行内容 表达式 tail [options] [filenames] 常用参数 -c:输出最后N个字节 -f: ...
- Linux3.10.0块IO子系统流程(0)-- 块IO子系统概述
前言:这个系列主要是记录自己学习Linux块IO子系统的过程,其中代码分析皆基于Linux3.10.0版本,如有描述错误或不妥之处,敬请指出! 参考书籍:存储技术原理分析--基于Linux 2.6内核 ...
- P5280 [ZJOI2019]线段树
题目链接:洛谷 题目描述:[比较复杂,建议看原题] 这道题太神仙了,线段树上做树形dp. 根据树形dp的套路,都是按照转移的不同情况给节点分类.这里每次modify的时候对于节点的影响也不同,所以我们 ...
- day014 模块
# 1.用于多种语言交互 编程语言通用数据 # 内置的 不需要安装 直接导入使用 import json # 导入一个json模块 # dumps loads# dump load 有持久化的功能 # ...
- Qt 的坐标系统
QWidget *q = , Qt::WindowStaysOnTopHint); q->setWindowTitle(QObject::tr("父窗口widget")); ...
- SiteCore Experience Analytics-路径分析地图
路径分析地图 路径分析器是一个应用程序,允许您查看联系人在浏览网站时所采用的各种路径.您可以查看联系人在转换目标并与广告系列互动时所采用的路径,让您深入了解哪些路径为每次转化提供最佳参与价值,以及哪些 ...