题意:给一个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+最短路的更多相关文章

  1. hdu 4568 Hunter 最短路+dp

    Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  2. HDU 4568 Hunter 最短路+TSP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4568 Hunter Time Limit: 2000/1000 MS (Java/Others)Me ...

  3. HDU 4568 Hunter 最短路+状压DP

    题意:给一个n*m的格子,格子中有一些数,如果是正整数则为到此格子的花费,如果为-1表示此格子不可到,现在给k个宝藏的地点(k<=13),求一个人从边界外一点进入整个棋盘,然后拿走所有能拿走的宝 ...

  4. hdu 4568(SPFA预处理+TSP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:先用spfa预处理出宝藏与宝藏之间的最短距离,宝藏到边界的最短距离,然后就是经典的求TSP ...

  5. HDU 4568 SPFA + TSP

    这道题是长沙邀请赛的题,当时是道签到题. 这种题还是很常见的,讲一下思路. 首先是预处理出每个宝藏之间的距离,还有到边的距离,直接对每个宝藏进行一次SPFA就可以了. 然后就是经典的求TSP的过程. ...

  6. hdu 4568 Hunter bfs建图+TSP状压DP

    想AC的人请跳过这一段... 题目应该都能读懂.但是个人觉得这题出的很烂,意思太模糊了. 首先,进出次数只能是一次!!这个居然在题目中没有明确说明,让我在当时看到题目的时候无从下手. 因为我想到了这几 ...

  7. hdu 4568 Hunter(spfa预处理 + 状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:首先spfa预处理出每对宝藏之间的最短距离以及宝藏到边界的最短距离,然后dp[state] ...

  8. hdu2112(HDU Today 简单最短路)

    Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD ...

  9. F - JDG HDU - 2112 (最短路)&& E - IGNB HDU - 1242 (dfs)

    经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬 ...

  10. HDU 5521.Meeting 最短路模板题

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

随机推荐

  1. .net core mvc model填充过滤器

    在程序开发中,我们可能经常遇到所有的数据库表有相同的属性和行为,比如需要记录数据的创建人员,创建时间,修改时间和修改人.如果在每个action中都加上这些信息,代码看着比较冗余,看着不那么优雅,于是考 ...

  2. data-*存数据,拿出ul li中的数据

    <ul class="questions"> <li> <div class="question">1.您的年龄是?< ...

  3. 如何将自己的代码上传至github

    前提条件: 有个github账号,电脑安装了git; 首先在自己的账号里新建一个仓库: https://github.com/qiqi105/littleAlbum.git 进入到你要上传的文件夹内部 ...

  4. SHELL自动化--接口测试

    #!/bin/bash fileNum=`ls /bin/testShell/apiCheck_shell/logs/ | grep $(date "+%Y-%m-%d") | w ...

  5. IDA技巧

    3. 用[shift+F12]调出字符串表,再根据这些字符串,查看引用的地方,也可以分析出一些sub_0XXXX函数的功能. 进入import函数内 x查看调用处 jump to xref 跳到引用 ...

  6. Yum与RPM

    Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包管理,能够从指定的服务器自动下载 ...

  7. 备份Oracle 数据库。

    #!/bin/bash# 2018-07-07 oracle database back#filename=`date +%Y%m%d`filename=`date +%Y_%m_%d_%H%M`di ...

  8. docker 运行jenkins及vue项目与springboot项目(四.docker运行nginx)

    docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...

  9. 【leetcode】1001. Grid Illumination

    题目如下: On a N x N grid of cells, each cell (x, y) with 0 <= x < N and 0 <= y < N has a la ...

  10. 【leetcode】990. Satisfiability of Equality Equations

    题目如下: Given an array equations of strings that represent relationships between variables, each strin ...