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预 ...
随机推荐
- 2018-2019-2 网络对抗技术 20165321 Exp4 恶意代码分析
1.实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,sys ...
- 《linux就该这么学》第十二节课:第10章,Apache网站服务
第十章 10.1.网站服务程序 (让用户能够通过网站访问服务器上的资源) 目前提供的网站服务有IIS,Nginx,Apache等,IIS是windows中默认的web服务程序. Nginx是后起之秀, ...
- Ubuntu16.04彻底删除PHP7.2
一.删除php的相关包及配置 apt-get autoremove php7* 二.删除关联 sudo find /etc -name "*php*" |xargs rm -rf ...
- sql where 里面判定要加 ' '
WHERE year>=2010 and year<=2017 and indicator_code = 'SE.XPD.TOTL.GD.ZS'
- [游戏开发日志]Windows下Cocos2d-x 3.14环境搭建
总介绍 我们小组使用的是cocos2d-x的游戏开发引擎,因此在所有开发工作之前,我们需要对这个引擎进行环境的搭建. 搭建过程 VS2013的下载和安装 VS只是作为一个开发环境而已,简单来说就是敲代 ...
- 解析搜狗实验室精简版数据:1、批量将.txt编码格式转化为utf8 2、解析提取数据
在搜狗实验室里下载了精简版的数据,解压后是一个文件,里面有很多个.txt文档,里面编码格式都是ASCII.现需要将这些编码格式转化为utf-8,以下是python3语言编写的脚本,一般只需改变path ...
- CentOS-7.3 设置静态 ip
1. VMnet8 必须设置固定 ip,否则会发生:虚拟机可以访问主机和外网,但是主机 windows 却访问不了虚拟机 2. 虚拟网络编辑器设置网关 IP(G): 必须与 VMnet8 的 ip 在 ...
- qemu创建vm和vcpu进入kvm的流程
kvm是一个内核模块,它实现了一个/dev/kvm的字符设备来与用户进行交互,通过调用一系列ioctl函数可以实现qemu和kvm之间的切换. 1.qemu发起KVM_CREATE_VM的ioctl创 ...
- PAT (Basic Level) Practice (中文)1002 写出这个数 (20 分)
题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805324509200384 #include <iost ...
- ansible-2.1.0.0_module
ansible --version ansible 2.1.0.0 config file = /home/onest/luoliyu/ceph-ansible/ansible.cfg configu ...