题目链接: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. eclipse 编译JAVA 项目导入的WEB项目 无法编译问题

    右击你的项目 选择properties  ---->java Build Path--->Default output folder新建一个classes目录就好了 watermark/2 ...

  2. [Swift A] - HTTP请求

    iOS开发中大部分App的网络数据交换是基于HTTP协议的.本文将简单介绍在Swift中使用HTTP进行网络请求的几种方法. 注意:网络请求完成后会获得一个NSData类型的返回数据,如果数据格式为J ...

  3. struts action不在是一个单例类

    在servlet中,servlet类是一个单例,在servlet中的成员变量,将会被所有请求共享,同时也有可能存在线程安全问题,如有一个成员变量num,每次方法后市的num自增 package act ...

  4. iOS10相册相机闪退bug

    iOS10系统下调用系统相册.相机功能,遇到闪退的情况,描述如下: This app has crashed because it attempted to access privacy-sensit ...

  5. Lintcode---单词的添加与查找

    设计一个包含下面两个操作的数据结构:addWord(word), search(word) addWord(word)会在数据结构中添加一个单词.而search(word)则支持普通的单词查询或是只包 ...

  6. Spark缓存机制

    虽然默认情况下 RDD 的内容是临时的,但 Spark 提供了在 RDD 中持久化数据的机制.第一次调用动作并计算出 RDD 内容后,RDD 的内容可以存储在集群的内存或磁盘上.这样下一次需要调用依赖 ...

  7. 所需即所获:像 IDE 一样使用 vim

    所需即所获:像 IDE 一样使用 vim 转载 yangyangwithgnu@yeah.net2015-11-08 10:05:53 谢谢 捐赠:支付宝 yangyangwithgnu@yeah.n ...

  8. jquery为动态添加元素绑定点击事件

    on()方法添加的事件处理程序适用于当前及未来的元素(比如由脚本创建的新元素) $("#mainbody").on("click",".link&qu ...

  9. CCNA2.0笔记_NAT

    NAT:园区网内的PC是私有地址,整个园区网共享一个公有IP,如果园区网内的PC不做NAT,那么在发数据包给外网的时候会出现传输问题 NAT的原理:改变IP包头,使目的地址.源地址或两个地址在包头中被 ...

  10. ORACLE中NVL和COALESCE的区别

    nvl(COMMISSION_PCT,0)如果第一个参数为null,则返回第二个参数如果第一个参数为非null,则返回第一个参数 COALESCE(EXPR1,EXPR2,EXPR3...EXPRn) ...