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 ...
随机推荐
- XMPP即时通讯协议使用(十)——好友关系状态
sub ask recv 订阅 询问 接受 含义 substatus -1- 应该删除这个好友 Indicates that the roster item should be ...
- SQL查询连续年份
有这样一个问题,给出一个表格记录了夺冠球队的名称和年份,我们要做的就是写出一条SQL语句,查询再次期间连续夺冠的有哪些,起止时间是什么 下边是代码 create table #t(TEAM vaarc ...
- tf.keras 解决plot_model 的配置问题
https://blog.csdn.net/ha010/article/details/103367311
- QProcess
QT应用在windows系统下调用bat脚本,居然报错了.该BAT脚本,是用来检查svn.exe这个命令行工具,是否在当前系统里存在.在cmd终端里,一直是可正常执行的.但是在windows7家庭中文 ...
- Tornado中异步框架的使用
tornado的同步框架与其他web框架相同都是处理先来的请求,如果先来的请求阻塞,那么后面的请求也会处理不了.一直处于等待过程中.但是请求一旦得到响应,那么: 请求发送过来后,将需要的本站资源直接返 ...
- setTimeout()和setInterval()的用法及区别
setInterval 方法表示每间隔一段时间执行一次函数,会一直执行下去,除非手动 clearInterval 来停止. var i = 10; var timer = setInterval(() ...
- Kubernetes 健康检查的两种机制:Liveness 探测和 Readiness 探测
Kubernetes 健康检查的两种机制:Liveness 探测和 Readiness 探测,并实践了健康检查在 Scale Up 和 Rolling Update 场景中的应用.kubelet使用启 ...
- delphi中SendMessage使用说明
SendMessage基础知识 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数PostMessage不同,将一个消息寄送到一个线 ...
- CDN技术之--全局负载均衡(GSLB)
负载均衡就是智能调度全局负载均衡(GSLB)的负载均衡主要是在多个节点之间进行均衡,其结果可能直接终结负载均衡过程,也可能将用户访问交付下一层次的(区域或本地)负载均衡系统进行处理.GSLB最通用的是 ...
- BZOJ 4555(第二类斯特林数+NTT)
传送门 解题思路 数学题,推式子.求\(f(n)=\sum\limits_{i=0}^n\sum\limits_{j=0}^iS(i,j)2^jj!\) 首先可以把\(j\)往前提: \[f(n)=\ ...