HDU-4568 TSP+最短路
题意:给一个n行m列的矩阵,矩阵上的数字代表经过代价(这里要注意每经过一次都要付出代价),矩阵上有几个宝藏,猎人可以从任意边界进去矩阵取完所有宝藏后从任意边界出来。
解法:一看到宝藏数量小于等于13且必须经过,应该很容易想到TSP问题。所以我们用最短路预处理+状态压缩DP解决。首先预处理所有宝藏点到整个地图的最短路这是为了后续的dp代价做准备,然后开始状压dp,设计dp状态为dp[S][now]代表现在去了的宝藏点集为S且现在在now宝藏点的最小值,用记忆化搜索转移即可。
细节详见代码,应该挺好懂的:
#include<bits/stdc++.h>
using namespace std;
const int N=;
const int INF=0x3f3f3f3f;
const int dx[]={-,,,};
const int dy[]={,,,-};
int n,m,k,a[N][N],dp[<<][],es[N],px[N],py[N]; struct dat{
int d,x,y;
bool operator < (const dat &rhs) const {
return d>rhs.d;
}
};
priority_queue<dat> q;
int dis[][N][N];
bool vis[N][N];
void Dijkstra(int k) {
memset(dis[k],0x3f,sizeof(dis[k]));
memset(vis,,sizeof(vis));
q.push((dat){,px[k],py[k]});
dis[k][px[k]][py[k]]=;
while (!q.empty()) {
dat u=q.top(); q.pop();
if (vis[u.x][u.y]) continue;
vis[u.x][u.y]=;
for (int i=;i<;i++) {
int tx=u.x+dx[i],ty=u.y+dy[i];
if (tx< || tx>n || ty< || ty>m || a[tx][ty]==-) continue;
if (dis[k][tx][ty]>dis[k][u.x][u.y]+a[tx][ty]) {
dis[k][tx][ty]=dis[k][u.x][u.y]+a[tx][ty];
q.push((dat){dis[k][tx][ty],tx,ty});
}
}
}
} int lowbit(int x) { int ret=; for (;x;x-=x&-x) ret++; return ret; } int dfs(int now,int x) {
if (dp[now][x]!=-) return dp[now][x];
if (lowbit(now)==) return es[x]+a[px[x]][py[x]];
dp[now][x]=INF;
for (int i=;i<=k;i++)
if ((i!=x) && (now&(<<i-))) {
int tmp=dfs(now^(<<x-),i)+dis[i][px[x]][py[x]];
dp[now][x]=min(dp[now][x],tmp);
}
return dp[now][x];
} int main()
{
int T; cin>>T;
while (T--) {
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) for (int j=;j<=m;j++) scanf("%d",&a[i][j]);
scanf("%d",&k);
for (int i=;i<=k;i++) {
scanf("%d%d",&px[i],&py[i]);
px[i]++; py[i]++;
Dijkstra(i);
es[i]=INF;
for (int j=;j<=n;j++) es[i]=min(es[i],min(dis[i][j][],dis[i][j][m]));
for (int j=;j<=m;j++) es[i]=min(es[i],min(dis[i][][j],dis[i][n][j]));
}
memset(dp,-,sizeof(dp));
int ans=INF;
for (int i=;i<=k;i++) ans=min(ans,dfs((<<k)-,i)+es[i]);
if (ans==INF) printf("-1"); else printf("%d\n",ans);
}
return ;
}
HDU-4568 TSP+最短路的更多相关文章
- hdu 4568 Hunter 最短路+dp
Hunter Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 4568 Hunter 最短路+TSP
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4568 Hunter Time Limit: 2000/1000 MS (Java/Others)Me ...
- HDU 4568 Hunter 最短路+状压DP
题意:给一个n*m的格子,格子中有一些数,如果是正整数则为到此格子的花费,如果为-1表示此格子不可到,现在给k个宝藏的地点(k<=13),求一个人从边界外一点进入整个棋盘,然后拿走所有能拿走的宝 ...
- hdu 4568(SPFA预处理+TSP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:先用spfa预处理出宝藏与宝藏之间的最短距离,宝藏到边界的最短距离,然后就是经典的求TSP ...
- HDU 4568 SPFA + TSP
这道题是长沙邀请赛的题,当时是道签到题. 这种题还是很常见的,讲一下思路. 首先是预处理出每个宝藏之间的距离,还有到边的距离,直接对每个宝藏进行一次SPFA就可以了. 然后就是经典的求TSP的过程. ...
- hdu 4568 Hunter bfs建图+TSP状压DP
想AC的人请跳过这一段... 题目应该都能读懂.但是个人觉得这题出的很烂,意思太模糊了. 首先,进出次数只能是一次!!这个居然在题目中没有明确说明,让我在当时看到题目的时候无从下手. 因为我想到了这几 ...
- hdu 4568 Hunter(spfa预处理 + 状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:首先spfa预处理出每对宝藏之间的最短距离以及宝藏到边界的最短距离,然后dp[state] ...
- hdu2112(HDU Today 简单最短路)
Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD ...
- F - JDG HDU - 2112 (最短路)&& E - IGNB HDU - 1242 (dfs)
经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬 ...
- HDU 5521.Meeting 最短路模板题
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
随机推荐
- 用户Bug修补报告
用户Bug修补报告 虽然经过许多天的奋斗,我们的U-Help已经正式投入使用,不过在使用过程中遇到了大大小小的问题,我们通过努力修补了其中的相当一部分,以下是用户Bug修补报告. 7.31:发布bet ...
- Nginx的应用之安装配置
一.Nginx简述 Nginx是一个开源且高性能.可靠的Http Web服务.代理服务. 开源: 直接获取源代码 高性能: 支持海量并发 可靠: 服务稳定 我们为什么选择 Nginx服务 Nginx非 ...
- sqlldr - exit error code 2 in unix (merged)
http://www.orafaq.com/forum/t/146582/ Thank you for your reply. Load has been successful all the tim ...
- powerdesigner级联删除
在Reference Properties属性窗口的Integrity属性页中选中Delete Constraint的Cascade;选中Update Constraint的Cascade.
- sigmoid 和 soft-max总结
1)sigmoid函数(也叫逻辑斯谛函数): 引用wiki百科的定义: A logistic function or logistic curve is a common “S” shape (si ...
- 前端学习(二十八)es6&ajax(笔记)
ES6 let 块级作用域 const 解构赋值 字符串拼接 扩展运算符 ------------------------------------------ ...
- java实现http协议发送和接收数据
public void sendMessage() throws Exception { System.out.println("调用servlet开始=================&q ...
- PHP面试 MySQL的SQL语句编写
MySQL的SQL语句编写 面试题一 有A表(id,sex,par,c1,c2),B(id,age,c1,c2)两张表,其中A.id与B.id关联,现在要求写出一条SQL语句,将B中age>50 ...
- 对业务类进行构造的工厂类BLLFactory
using System; using System.Collections.Generic; using System.Text; using System.Collections; using W ...
- 08 java代码块的概述和分类
08.01_面向对象(代码块的概述和分类) A:代码块概述 在Java中,使用{}括起来的代码被称为代码块. B:代码块分类 根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代 ...