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的更多相关文章

  1. HDU 4284Travel(状压DP)

    HDU 4284    Travel 有N个城市,M条边和H个这个人(PP)必须要去的城市,在每个城市里他都必须要“打工”,打工需要花费Di,可以挣到Ci,每条边有一个花费,现在求PP可不可以从起点1 ...

  2. 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表示 ...

  3. HDU 3001 Travelling ——状压DP

    [题目分析] 赤裸裸的状压DP. 每个点可以经过两次,问经过所有点的最短路径. 然后写了一发四进制(真是好写) 然后就MLE了. 懒得写hash了. 改成三进制,顺利A掉,时间垫底. [代码] #in ...

  4. HDU - 5117 Fluorescent(状压dp+思维)

    原题链接 题意 有N个灯和M个开关,每个开关控制着一些灯,如果按下某个开关,就会让对应的灯切换状态:问在每个开关按下与否的一共2^m情况下,每种状态下亮灯的个数的立方的和. 思路1.首先注意到N< ...

  5. hdu 4114(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4114 思路:首先是floyd预处理出任意两点之间的最短距离.dp[state1][state2][u] ...

  6. hdu 4856 Tunnels 状态压缩dp

    Tunnels Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem ...

  7. HDU 3091 - Necklace - [状压DP]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3091 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  8. HDU 3811 Permutation 状压dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3811 Permutation Time Limit: 6000/3000 MS (Java/Othe ...

  9. HDU 5838 (状压DP+容斥)

    Problem Mountain 题目大意 给定一张n*m的地图,由 . 和 X 组成.要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的 ...

随机推荐

  1. maven工程下添加oracle驱动包

    maven工程手动安装oracle驱动包到本地仓库 下载ojdbc.jar包 这个当然是最好去官网下载了.http://mvnrepository.com这个仓库上有,具体页面地址为: http:// ...

  2. 拦截器、过滤器、@Aspect 区别

    1.需求场景 之前也有在文章写道 “拦截器\过滤器" 的区别,文章链接,在实际开发过程中,我们可能会遇到拦截请求参数的需求,在这我举个场景. 某一个接口的请求参数都是加密的,而请求参中还有一 ...

  3. 线程 学习教程(一): Java中终止(销毁)线程的方法

    结束线程有以下三种方法:(1)设置退出标志,使线程正常退出,也就是当run()方法完成后线程终止 (2)使用interrupt()方法中断线程 (3)使用stop方法强行终止线程(不推荐使用,Thre ...

  4. python数据结构-如何在列表、字典、集合中根据条件筛选数据

    如何在列表.字典.集合中根据条件筛选数据 问题举例: 过滤列表[1, 2, 5, -1, 9, 10]中的负数 筛选字典{“zhangsan”:97, "lisi":80, &qu ...

  5. JAVA:IDEA安装、创建项目、tomcat配置、maven配置(1)

    一.安装 JDK安装自行百度,IDEA安装: IDEA安装包下载:https://www.jetbrains.com/idea/download/ 安装过程一路默认,需要选择的就勾选 .java之类的 ...

  6. WIN7虚拟桌面创建(多屏幕多桌面)

    Windows7/WIN7虚拟桌面怎么用怎么创建多桌面(摘录) 在使用电脑中经常会遇到桌面软件太多了不够用的感慨,那么要是一台电脑有多个桌面就好了.在windows10中自带已经支持了虚拟桌面,在wi ...

  7. 组件式开发(Vue)

    什么是组件式开发: 组件式开发就是将单个组件组合起来,形成一个大的组件进行页面的开发完成 什么是复合型组件: 复合型组件就是将相同的功能写成一个公用的组件(单元组件),供其他组件使用,就类似于后台开发 ...

  8. PHP----------用curl方式请求接口在同一个项目里面的时候不能请求的情况

    1.环境是wnmp 2.NGINX中,看PHP文件块fastcig-pass的设置值(127.0.0.1:9000).设置都是以keepalive方式请求,接收到PHP文件时,交于后端过程PHPCGI ...

  9. Hbase伪分布式安装

    前面的文章已经讲过hadoop伪分布式安装,这里直接介绍hbase伪分布式安装. 1. 下载hbase 版本hbase 1.2.6 2. 解压hbase 3. 修改hbase-env.sh 新增如下内 ...

  10. kafka消费者实时消费数据存入hdfs java scalca 代码

    hadoop-client依赖很乱 调试很多次cdh版本好多jar没有 用hadoop2.7.3可以 自定义输出流的池子进行流管理 public void writeLog2HDFS(String p ...