题目链接: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. 01-hibernate注解:类级别注解,@Entity,@Table,@Embeddable

    @Entity @Entity:映射实体类 @Entity(name="tableName") name:可选,对应数据库中一个表,若表名与实体类名相同,则可以省略. 注意:使用@ ...

  2. Debian 的 apt 命令不能使用自动完成的问题

    我的Debian是8.10,使用apt-get命令可以正常使用自动完成功能,但apt命令却不行,在国外的一个网站上找到了解决办法: 从这个地址 http://pastebin.com/PRBMt3an ...

  3. C# 遍历Dictionary并修改其中的Value

    C#的Dictionary类型的值,知道key后,value可以修改吗?答案是肯定能修改的.我在遍历的过程中可以修改Value吗?答案是也是肯定能修改的,但是不能用For each循环.否则会报以下的 ...

  4. SD卡路径问题以及如何获取SDCard 内存

            昨天在研究拍照后突破的存储路径的问题,开始存储路径写死为:    private String folder = "/sdcard/DCIM/Camera/"(SD ...

  5. GNU--gprof使用总结

    Added macros ACE_USES_GPROF which enables users to use gprof in a multithreaded environment with ACE ...

  6. hihoCoder[Offer收割]编程练习赛1题目解析

    题目1 : 九宫 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小Hi近期在教邻居家的小朋友小学奥数.而近期正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不反 ...

  7. Hibernate JPA实体继承的映射(二) @MappedSuperclass

    基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中. 1.@MappedSuperclass注解只能标准在类上:@ ...

  8. git 这一篇就够80%使用情况了

    转 Git 命令详解及常用命令整理 Git 命令详解及常用命令 Git作为常用的版本控制工具,多了解一些命令,将能省去很多时间,下面这张图是比较好的一张,贴出了看一下: 关于git,首先需要了解几个名 ...

  9. laravel中,提交表单后给出提示例如添加成功,添加失败等等

    laravel中的表单插入,我想在表单插入成功后,可以像thinkphp一样可以有一个提示内容,上网Google,他们还是给出的方法就是 return redirect('/')->with(' ...

  10. 点滴积累【JS】---JS小功能(offsetLeft实现图片滚动效果)

    效果: 代码: <head runat="server"> <title></title> <style type="text/ ...