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的点小于其周围的点,编号为.的点至少大于一个其周围的 ...
随机推荐
- idea实用插件
代码规范检测插件: Alibaba Java Coding GuideLines使用@data插件lombok数据库mapper插件mybatisX前端运行vue的插件,装起了后在Terminal上运 ...
- 团队作业记账本开发NABCD
N(Need)需求 现如今大学生的消费存在很大问题,很多情况下都是图一时之快,冲动消费,但是其实这些东西并不是特别需要.这样慢慢的堆积也就导致了大学生月月精光的局面.另外,现在基本上人手一部手机,许多 ...
- 设备树..ing
.dts==>.dtb ==>device_node ==> platform_device ==> led_dev.c ==>匹配 led_drv.c (设备 ...
- docker+httpd的安装
docker pull docker.io/httpd //直接这么运行会报“没有conf/httpd.cong这个文件” docker run -d --name httpd2. -p : -p : ...
- (转载)Java Map中的Value值如何做到可以为任意类型的值
转载地址:http://www.importnew.com/15556.html 如有侵权,请联系作者及时删除. 搬到我的博客来,有空细细品味,把玩. 本文由 ImportNew - shut ...
- Golang--不定参数类型
1.不定参数类型 不定参数是指函数传入的参数个数为不定数量. package main import ( "fmt" ) //不定参数函数 func Add(a int, args ...
- Java 中的E,K,V,T,U,S
Java泛型中的标记符含义: E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number ...
- Java-番外篇-Java通过代码发给手机发信息
一.代码 import java.io.IOException; import org.apache.commons.httpclient.Header; import org.apache.comm ...
- mysql优化方案之sql优化
优化目标 1.减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先 ...
- Fast Matrix Calculation HDU - 4965
One day, Alice and Bob felt bored again, Bob knows Alice is a girl who loves math and is just learni ...