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. 环形dp

    对于环形的dp 大多情况都是破环成链 例如 那道宝石手镯的环形 一般来说都是要破环成链的. 或者说 是 两次dp 一次断开 一次强制连接即可. 我想 我应该沉淀下来了这些天写的题都有点虚 要不就是看了 ...

  2. 【JVM】-NO.110.JVM.1 -【GC垃圾收集器】

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

  3. Android签名文件转化为pk8和pem来对apk重签名

    当我们需要修改已经打包好的apk中的某个文件时,比如改下图标,我们势必要采用反编译apk,改文件,重编译apk,重签名才行,参考:https://www.cnblogs.com/zndxall/p/9 ...

  4. XgBoost推导与总结

    一 .机器学习算法中GBDT和XGBOOST的区别有哪些?(转自知乎https://www.zhihu.com/question/41354392/answer/98658997) xgboost相比 ...

  5. Java基础(变量数&常量&据类型&类型转换)

    什么是变量: 变量就是一个不固定的数值,它随时会改变,就像银行卡里存的钱一样会变动. 变量的格式:1  数据类型 变量名=变量值:  2  数据类型 变量名: 变量名=变量值: 变量的三大要素:1变量 ...

  6. CurrentHashMap、HashMap、HashTable的区别

    HashTable 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相 ...

  7. day09 python之函数进阶

    楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x>y else y return mbigger = my_max(10,20)print ...

  8. highChart 缺值-曲线断开问题

    time =item.datetime; aqi = Number(item.aqi); pm2_5 = Number(item.pm25); pm10 = Number(item.pm10); co ...

  9. Web_Toy

    1 2 3 4 1.App录音 var r = plus.audio.getRecorder() # 创建录音对象 r.record({filename:"_doc/audio/" ...

  10. Numpy 数据类型和基本操作

    Numpy 数据类型 bool 用一位存储的布尔类型(值为TRUE或FALSE) inti 由所在平台决定其精度的整数(一般为int32或int64) int8 整数,范围为128至127 int1 ...