hdu 4856 Tunnels 状态压缩dp
Tunnels
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
For each testcase, the first line contains two integers N (1 ≤ N ≤ 15), the side length of the square map and M (1 ≤ M ≤ 15), the number of tunnels.
The map of the city is given in the next N lines. Each line contains exactly N characters. Barrier is represented by “#” and empty grid is represented by “.”.
Then M lines follow. Each line consists of four integers x1, y1, x2, y2, indicating there is a tunnel with entrence in (x1, y1) and exit in (x2, y2). It’s guaranteed that (x1, y1) and (x2, y2) in the map are both empty grid.
If it is impossible for Bob to visit all the tunnels, output -1.
....#
...#.
.....
.....
.....
2 3 1 4
1 2 3 5
2 3 3 1
5 4 2 1
题意:一个图,#不可达,m条单向通道,点间花费1时间,通道起点到终点不花费时间,求最少花费时间;
思路:状态压缩dp,dp[i][j] i表示已经走过哪些通道,j表示最后的走的那条通道是哪条。
dp[i][j]=dp[i-(1<<(j-1)][k] +dis(k,j) dis(k,j)表示第k条通道的终点到第j条通道的起点距离;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<map>
#include<bitset>
#include<time.h>
using namespace std;
#define LL long long
#define pi (4*atan(1.0))
#define eps 1e-8
#define bug(x) cout<<"bug"<<x<<endl;
const int N=+,M=1e6+,inf=1e9+,MOD=1e9+;
const LL INF=1e18+,mod=1e9+; int n,m,vis[N][N];
char a[N][N];
struct is
{
int s,t,e,d;
} q[N];
int check(int x,int y)
{
if(x<=||x>n||y<=||y>n)return ;
return ;
}
int dis[N][N][N][N];
int xx[]= {,,-,};
int yy[]= {,,,-};
void bfs(int s,int t)
{
queue<pair<int,int> >q;
q.push(make_pair(s,t));
memset(vis,,sizeof(vis));
vis[s][t]=;dis[s][t][s][t]=;
while(!q.empty())
{
pair<int,int> p=q.front();
q.pop();
for(int i=; i<; i++)
{
int x=p.first+xx[i];
int y=p.second+yy[i];
if(check(x,y)&&!vis[x][y]&&a[x][y]=='.')
{
vis[x][y]=;
dis[s][t][x][y]=dis[s][t][p.first][p.second]+;
q.push(make_pair(x,y));
}
}
}
}
int dp[][N];
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(dis,-,sizeof(dis));
for(int i=; i<=n; i++)
scanf("%s",a[i]+);
for(int i=; i<=m; i++)
scanf("%d%d%d%d",&q[i].s,&q[i].t,&q[i].e,&q[i].d);
for(int i=;i<=n;i++)for(int j=;j<=n;j++)bfs(i,j);
memset(dp,-,sizeof(dp));
for(int i=;i<=(<<m)-;i++)
{
for(int j=;j<=m;j++)
{
if((<<(j-))&i)
{
int now=i-(<<(j-));
if(!now)
{
dp[i][j]=;
continue;
}
for(int k=;k<=m;k++)
{
if(now&(<<(k-)))
{
if(dp[now][k]!=-&&dis[q[k].e][q[k].d][q[j].s][q[j].t]!=-)
{
int temp=dp[i][j];
dp[i][j]=dp[now][k]+dis[q[k].e][q[k].d][q[j].s][q[j].t];
if(temp!=-)dp[i][j]=min(dp[i][j],temp);
}
}
}
}
}
}
int ans=inf;
for(int i=;i<=m;i++)
if(dp[(<<m)-][i]!=-)ans=min(ans,dp[(<<m)-][i]);
if(ans!=inf)printf("%d\n",ans);
else printf("-1\n");
}
return ;
}
hdu 4856 Tunnels 状态压缩dp的更多相关文章
- hdu 5094 Maze 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...
- HDU 3001(状态压缩dp)
状态压缩dp的第一题! 题意:Mr ACMer想要进行一次旅行,他决定访问n座城市.Mr ACMer 可以从任意城市出发,必须访问所有的城市至少一次,并且任何一个城市访问的次数不能超过2次.n座城市间 ...
- HDU 3001【状态压缩DP】
题意: 给n个点m条无向边. 要求每个点最多走两次,要访问所有的点给出要求路线中边的权值总和最小. 思路: 三进制状态压缩DP,0代表走了0次,1,2类推. 第一次弄三进制状态压缩DP,感觉重点是对数 ...
- hdu 5045 Contest(状态压缩DP)
题解:我们使用一个二位数组dp[i][j]记录进行到第i个任务时,人组合为j时的最大和(这里的j我们用二进制的每位相应一个人). 详细见代码: #include <iostream> #i ...
- hdu 3091 Necklace 状态压缩dp *******
Necklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327680/327680 K (Java/Others)Total ...
- hdu 4628 Pieces 状态压缩dp
Pieces Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total S ...
- HDU 2167 Pebbles 状态压缩dp
Pebbles Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- hdu 4856 Tunnels(bfs+状态压缩)
题目链接:hdu 4856 Tunnels 题目大意:给定一张图,图上有M个管道,管道给定入口和出口,单向,如今有人想要体验下这M个管道,问最短须要移动的距离,起点未定. 解题思路:首先用bfs处理出 ...
- HDU 4856 Tunnels(BFS+状压DP)
HDU 4856 Tunnels 题目链接 题意:给定一些管道.然后管道之间走是不用时间的,陆地上有障碍.陆地上走一步花费时间1,求遍历全部管道须要的最短时间.每一个管道仅仅能走一次 思路:先BFS预 ...
随机推荐
- 基于Promise封装uni-app的request方法,实现类似axios形式的请求
https://my.oschina.net/u/2428630/blog/3004860 uni-app框架中 安装(项目根目录下运行) npm install uni-request --save ...
- Python selenium根据class定位页面元素
在日常的网页源码中,我们基于元素的id去定位是最万无一失的,id在单个页面中是不会重复的.但是实际工作中,很多前端开发人员并未给每个元素都编写id属性.通常一段html代码如下: <div cl ...
- Windows 2008 r2上安装MySQL
用MSI安装包安装 根据自己的操作系统下载对应的32位或64位安装包.按如下步骤操作: MySQL数据库官网的下载地址http://dev.mysql.com/downloads/mysql,第一步: ...
- 关于Linux目录结构的理解
dUI与刚接触Linux的学习者来说,那么多的根下目录足够让我们头疼不已,如下图: 那么对于初学者来说,我们首要了解的是哪些目录呢? 就是这个标黄绿色的tmp目录,此目录是一个存放临时文件夹的目录( ...
- Nodejs使用robot操作鼠标键盘
1.安装robotjs库 前提是配置了cnpm cnpm i robotjs -g 2.如果报错VCBuild.exe,如下可以安装windows-tool MSBUILD : error MSB ...
- work-7.2
安装ubuntu,jdk ,git,maven,Intellij. 配置GIT时,需要将在本地生成的公钥粘贴到服务端. 先占个座,具体过程待补充. -------------------------- ...
- ACM-ICPC 2018 南京赛区网络预赛(A, J)
A 签到题 Alice, a student of grade 666, is thinking about an Olympian Math problem, but she feels so d ...
- 打造RecyclerView的n级列表
先上效果图: 1.该多级列表的优势: 支持无限级列表展开 基于一个recyclerView实现 可以自定义每一级item的样式,定制化更强 2.设计的思路 数据结构List,ItemBean类中有变量 ...
- MyBatis探究-----动态SQL详解
1.if标签 接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee); XML中:where 1=1必不 ...
- HBase Thrift过滤语法
摘抄自hbase ref guide 0.94: 在写本文的时候,hbase ref guide已经更新到1.2及2.0了,但是个人感觉Thrift过滤语法部分写得都没有0.94的好,省掉了examp ...