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. ADB命令(全)

    当熟悉Shell命令的人使用adb是没有任何难度的,因为adb中绝大多少命令都是引用的shell命令 以下命令进行归类,红色部分字体是测试人员常用的adb命令 基础命令 1.启动adb服务 adb s ...

  2. 上传js,js修改html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 通过android studio的gradle强制cmake输出命令详情

    https://stackoverflow.com/questions/43439549/force-cmake-in-verbose-mode-via-gradle-and-the-android- ...

  4. python基础之 初识函数&函数进阶

    函数基础部分 1.什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...

  5. 【Mac】-NO.100.Mac.1.java.1.001-【Mac Install multiple JDK】-

    Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  6. 使用Chrome远程调试GenyMotion上的WebView程序

    WebView让我们方便的使用熟悉的Html/JS/Css来开发APP.但是,当出现问题时,却没有PC上那么方便的排查问题.PC上,前端的问题我们可以使用Chrome的开发者工具方便的调试.Andro ...

  7. laravel 比较好的资料地址 看云

    https://www.kancloud.cn/curder/laravel/408497

  8. 20190404用户及用户组管理(week1_day4)

    useradd userdel usermod groupadd groupdel 用户管理 为什么需要有用户? 1. linux是一个多用户系统 2. 权限管理(权限最小化) 用户:存在的目录是为了 ...

  9. 处理centos6或者7依赖关系(Nginx、MySQL、PHP)的方法

     yum -y install make gcc gcc-c++ gcc-g77 flex bison file libtool libtool-libs autoconf kernel-devel  ...

  10. jQuery基本的属性操作

    attr和prop,prop常用来操作标签的固有属性,比方说checkbox的checked属性.select的selected属性,而attr常用来操作我们自己给标签添加的属性. $('div'). ...