题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568

思路:先用spfa预处理出宝藏与宝藏之间的最短距离,宝藏到边界的最短距离,然后就是经典的求TSP过程了。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 222
#define inf 1<<30 struct Point{
int x,y;
}point[MAXN]; int value[MAXN][MAXN];//原图
int map[MAXN][MAXN];//宝藏间的最短距离
int dist[MAXN][MAXN];//宝藏到边界的距离
int dd[MAXN];//宝藏到达边界的最短距离
bool mark[MAXN][MAXN];
int dp[<<][];
int n,m,k;
int dir[][]={{-,},{,},{,-},{,}}; void spfa(int num)
{
memset(mark,false,sizeof(mark));
for(int i=;i<n;i++)
for(int j=;j<m;j++)dist[i][j]=inf;
queue<pair<int,int> >que;
que.push(make_pair(point[num].x,point[num].y));
if(dist[point[num].x][point[num].y]==-)return;
dist[point[num].x][point[num].y]=;
while(!que.empty()){
int x=que.front().first,y=que.front().second;
que.pop();
mark[x][y]=false;
if(x==||x==(n-)||y==||y==(m-)){
dd[num]=min(dd[num],dist[x][y]);
}
for(int i=;i<;i++){
int xx=x+dir[i][],yy=y+dir[i][];
if(xx>=&&xx<n&&yy>=&&yy<m&&value[xx][yy]!=-){
if(dist[x][y]+value[xx][yy]<dist[xx][yy]){
dist[xx][yy]=dist[x][y]+value[xx][yy];
if(!mark[xx][yy]){
mark[xx][yy]=true;
que.push(make_pair(xx,yy));
}
}
}
}
}
} int main()
{
int _case;
scanf("%d",&_case);
while(_case--){
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
for(int j=;j<m;j++)
scanf("%d",&value[i][j]);
scanf("%d",&k);
for(int i=;i<k;i++)scanf("%d%d",&point[i].x,&point[i].y);
for(int i=;i<k;i++)
for(int j=;j<k;j++)
map[i][j]=(i==j)?:inf;
for(int i=;i<(<<k);i++)
for(int j=;j<k;j++)dp[i][j]=inf;
fill(dd,dd+MAXN,inf);
for(int i=;i<k;i++){
spfa(i);
for(int j=;j<k;j++){
if(i==j)continue;
map[i][j]=min(map[i][j],dist[point[j].x][point[j].y]);//宝藏与宝藏之间的最近距离
}
dp[<<i][i]=dd[i]+value[point[i].x][point[i].y];//宝藏到边的最近距离
}
for(int s=;s<(<<k);s++){
for(int i=;i<k;i++){
if(s&(<<i)==)continue;
if(dp[s][i]==inf)continue;
for(int j=;j<k;j++){
if(s&(<<j)==)continue;
dp[s|(<<j)][j]=min(dp[s|(<<j)][j],dp[s][i]+map[i][j]);
}
}
}
int ans=inf;
for(int i=;i<k;i++){
ans=min(ans,dp[(<<k)-][i]+dd[i]);//拿到了所有的宝藏之后还要走出来
}
printf("%d\n",ans);
}
return ;
}

hdu 4568(SPFA预处理+TSP)的更多相关文章

  1. HDU 4568 SPFA + TSP

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

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

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

  3. loj 1316(spfa预处理+状压dp)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27024 题意:求0-(n-1)的经过最多的标记的点的最短路. 思路 ...

  4. loj 1150(spfa预处理+二分+最大匹配)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26864 思路:首先是spfa预处理出每个'G'到'H'的最短距离, ...

  5. hdu 4568 Hunter 最短路+dp

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

  6. HDU 4568 Hunter 最短路+TSP

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

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

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

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

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

  9. hdu 4284 Travel(floyd + TSP)

    虽然题中有n<=100个点,但实际上你必须走过的点只有H<=15个.而且经过任意点但不消耗C[i]跟D[i]可以为无限次,所以可以floyd预处理出H个点的最短路,之后剩下的...就成了裸 ...

随机推荐

  1. <译>Spark Sreaming 编程指南

    Spark Streaming 编程指南 Overview A Quick Example Basic Concepts Linking Initializing StreamingContext D ...

  2. Chrome Dev Editor:一个新的JavaScript和Dart IDE

    在Google IO 2014期间,一位Google工程师带来了Chrome Dev Editor(CDE).该IDE用于创建面向桌面和移动设备的Chrome应用程序和Web应用程序.CDE支持Jav ...

  3. MAC OS X 10.8 操作远程SSH服务器 + 无密码输入使用SSH服务器

    怀揣着为中小企业量身定做一整套开源软件解决方案的梦想开始了一个网站的搭建.http://www.osssme.org/ 使用命令行连接连接远程SSH服务器,root为我使用的远程服务器用户名,@后为I ...

  4. Android工程:引用另一个Android工程的方法详解

    本篇文章是对在Android中引用另一个Android工程的方法进行了详细的分析介绍.需要的朋友参考下   现在已经有了一个Android工程A.我们想扩展A的功能,但是不想在A的基础上做开发,于是新 ...

  5. JavaScript中使用JSON,即JS操作JSON总结

    JSON(JavaScript Object Notation 对象标记) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生 ...

  6. nodejs 中使用shell脚本

    虽然nodejs的require('child_process').execSync可以使用shell,但其实问题特别多.尤其是符号和语法冲突,可读性也很差,只能完成一些小规模的shell使用. co ...

  7. DDR 复位

    将FPGA代码和实际的数字电路对应起来. always @ (negedge clk_ref_200)     begin     if(ddr3_init_done)    'b10)   'b10 ...

  8. 日志分析工具--GoAccess的安装部署

    需求:及时得到线上用户访问日志分析统计结果,以便给开发.测试.运维.运营人员提供决策! 方案:GoAccess,图文并茂,而且速度快,每秒8W 的日志记录解析速度,websocket10秒刷新统计数据 ...

  9. mybatis expected at least 1 bean which qualifies as autowire candidate for this dependency

    错误原因:没有引入相应mapper接口,导致spring没有找到依赖 解决方法一:使用注解的方法: 首先在spring配置文件中添加 <bean class="org.mybatis. ...

  10. java集成开发环境常用操作集

    1.简单搭建maven集成开发环境 一.     Jetty安装 下载地址(包涵windows和Linux各版本,Jetty9需要JDK7):http://download.eclipse.org/j ...