Problem Description
  One day, a hunter named James went to a mysterious area to find the treasures. James wanted to research the area and brought all treasures that he could.
  The area can be represented as a N*M rectangle. Any points of the rectangle is a number means the cost of research it,-1 means James can't cross it, James can start at any place out of the rectangle, and explore point next by next. He will move in the rectangle and bring out all treasures he can take. Of course, he will end at any border to go out of rectangle(James will research every point at anytime he cross because he can't remember whether the point are researched or not).
  Now give you a map of the area, you must calculate the least cost that James bring out all treasures he can take(one point up to only one treasure).Also, if nothing James can get, please output 0.
 
Input
  The input consists of T test cases. The number of test cases T is given in the first line of the input. Each test case begins with a line containing 2 integers N M , (1<=N,M<=200), that represents the rectangle. Each of the following N lines contains M numbers(0~9),represent the cost of each point. Next is K(1<=K<=13),and next K lines, each line contains 2 integers x y means the position of the treasures, x means row and start from 0, y means column start from 0 too.
 
Output
  For each test case, you should output only a number means the minimum cost.
 
题目大意:一个n*m的格子,每个格子有一个花费cost,如果花费是-1代表格子不能走。现在格子里有K个宝藏,问拿齐K个宝藏的最小花费,只能进出一次。
思路:首先,注意到K很小,还是一个很奇葩的数字。所以,其实这题的路径就是要走遍这K个点的最短路,这就是经典的TSP问题,位DP解决。需要预处理出每个点到其他点的最短路径,把矩阵外看成一个点(在我的代码里标号为K),对每个点做单源最短路径即可。
PS:这题有说,如果拿不到任何宝藏输出0,其实这条件是没用的……这题的描述有一点坑爹,如果你有一些宝藏能拿到,有一些宝藏不能拿到(被一堆-1围着),那我要输出啥?经测试根本就没有这种东西……因为都是有答案的所以根本就不需要考虑宝藏所在点是-1和点点之间不连通这种坑爹的问题了。
PS2:我做这题的时候没看到-1,然后Dijkstra+heap不断MLE,后来加了个vis判是否出队的问题,就WA了……之前一直没想明白为什么会出现MLE的情况,看来是-1加了进去有无穷多的数进队导致……
 
代码(171MS):
 #include <cstdio>
#include <queue>
#include <utility>
#include <iostream>
#include <cstring>
using namespace std;
typedef pair<int, int> PII; const int MAXN = ; int mat[MAXN][MAXN], tx[], ty[];
int dis[MAXN][MAXN], di[][];
bool ist[MAXN][MAXN];
int post[MAXN][MAXN];
int n, m, k; #define pos(x, y) (x*MAXN+y) int fx[] = {-,,,};
int fy[] = {,,,-}; void min_path(int st_x, int st_y, int now) {
priority_queue<PII> que;
que.push(make_pair(-mat[st_x][st_y], pos(st_x, st_y)));
memset(dis, 0x3f, sizeof(dis));
dis[st_x][st_y] = mat[st_x][st_y];
while(!que.empty()) {
int abc = -que.top().first, tmp = que.top().second; que.pop();
int x = tmp / MAXN, y = tmp % MAXN;
if(abc != dis[x][y]) continue;
for(int i = ; i < ; ++i) {
int newx = x + fx[i], newy = y + fy[i];
if( <= newx && newx < n && <= newy && newy < m) {
if(mat[newx][newy] == -) continue;
if(dis[newx][newy] > mat[newx][newy] + dis[x][y]) {
dis[newx][newy] = mat[newx][newy] + dis[x][y];
que.push(make_pair(-dis[newx][newy], pos(newx, newy)));
if(ist[newx][newy] && dis[newx][newy] < di[now][post[newx][newy]])
di[now][post[newx][newy]] = dis[newx][newy];
}
}
else if(dis[x][y] < di[now][k]) di[now][k] = dis[x][y];
}
}
} int dp[][];
int ans, sum; int dfs(int u, int use) {
if(dp[u][use] < 0x3f3f3f3f) return dp[u][use];
if(use == ) {
return dp[u][use] = di[u][k];
}
for(int i = ; i < k; ++i) {
if(use & ( << i))
dp[u][use] = min(dp[u][use], di[u][i] + dfs(i, use ^ ( << i)));
}
return dp[u][use];
} void solve() {
memset(dp, 0x3f, sizeof(dp));
ans = 0x7fff7fff;
for(int i = ; i < k; ++i)
ans = min(ans, di[i][k] + dfs(i, ( << i) ^ (( << k) - )));
} void printdi() {
for(int i = ; i < k; ++i) {
for(int j = ; j <= k; ++j) printf("%d ", di[i][j]);
printf("\n");
}
} int main() {
int T;
scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
for(int i = ; i < n; ++i)
for(int j = ; j < m; ++j) scanf("%d", &mat[i][j]);
scanf("%d", &k);
memset(ist, , sizeof(ist));
sum = ;
for(int i = ; i < k; ++i) {
scanf("%d%d", &tx[i], &ty[i]);
ist[tx[i]][ty[i]] = true;
post[tx[i]][ty[i]] = i;
sum += mat[tx[i]][ty[i]];
}
memset(di, 0x3f, sizeof(di));
for(int i = ; i < k; ++i) min_path(tx[i], ty[i], i);
//printdi();
solve();
printf("%d\n", ans - sum);
}
}

HDU 4568 Hunter(最短路径+DP)(2013 ACM-ICPC长沙赛区全国邀请赛)的更多相关文章

  1. HDU 4571 Travel in time ★(2013 ACM/ICPC长沙邀请赛)

    [题意]给定N个点,每个点有一个停留所需的时间Ci,和停留能够获得的满意度Si,有M条边,每条边代表着两个点走动所需的时间ti,现在问在规定的T时间内从指定的一点S到E能够获得的最大的满意度是多少?要 ...

  2. HDU 4758——Walk Through Squares——2013 ACM/ICPC Asia Regional Nanjing Online

    与其说这是一次重温AC自动机+dp,倒不如说这是个坑,而且把队友给深坑了. 这个题目都没A得出来,我只觉得我以前的AC自动机的题目都白刷了——深坑啊. 题目的意思是给你两个串,每个串只含有R或者D,要 ...

  3. HDU 4571 Travel in time(最短路径+DP)(2013 ACM-ICPC长沙赛区全国邀请赛)

    Problem Description Bob gets tired of playing games, leaves Alice, and travels to Changsha alone. Yu ...

  4. hdu 4751 Divide Groups bfs (2013 ACM/ICPC Asia Regional Nanjing Online 1004)

    SDUST的训练赛 当时死磕这个水题3个小时,也无心去搞其他的 按照题意,转换成无向图,预处理去掉单向的边,然后判断剩下的图能否构成两个无向完全图(ps一个完全图也行或是一个完全图+一个孤点) 代码是 ...

  5. 2013 ACM/ICPC 长沙网络赛J题

    题意:一个数列,给出这个数列中的某些位置的数,给出所有相邻的三个数字的和,数列头和尾处给出相邻两个数字的和.有若干次询问,每次问某一位置的数字的最大值. 分析:设数列为a1-an.首先通过相邻三个数字 ...

  6. 2013 ACM/ICPC 长沙现场赛 A题 - Alice's Print Service (ZOJ 3726)

    Alice's Print Service Time Limit: 2 Seconds      Memory Limit: 65536 KB Alice is providing print ser ...

  7. 2013 ACM/ICPC 长沙现场赛 C题 - Collision (ZOJ 3728)

    Collision Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge There's a round medal ...

  8. HDU 4573 Throw the Stones(动态三维凸包)(2013 ACM-ICPC长沙赛区全国邀请赛)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4573 Problem Description Remember our childhood? A fe ...

  9. HDU 4569 Special equations(枚举+数论)(2013 ACM-ICPC长沙赛区全国邀请赛)

    Problem Description Let f(x) = anxn +...+ a1x +a0, in which ai (0 <= i <= n) are all known int ...

随机推荐

  1. Elasticsearch插件安装

    从github获取插件包例如Head git clone git://github.com/mobz/elasticsearch-head.git 在elasticsearch安装目录中创建插件存放目 ...

  2. window系统mysql无法输入和无法显示中文的处理配置

    第一步:使用记事本打开mysql安装目录下的"my.ini”文件. # MySQL client library initialization. [client] port= [mysql] ...

  3. Linux基础命令之文件和目录操作(一)

    pwd print working directory的缩写,作用是显示当前工作目录的绝对路径,一般进行频繁切换路径时使用. -L 显示逻辑路径(或略软链接文件),不常用. -P 显示物理路径,不常用 ...

  4. Python入门 —— 02基础语法

    基础语法入门学习推荐: 简明 Python 教程 下文仅为入门推荐书籍的补充与重点 多行语句:末尾使用斜杠 (  ) ,将一行分为多行 var = item1 + item2 + item3 注释: ...

  5. yii学习笔记(6),连接数据库,创建活动记录类

    创建数据库用于测试 配置数据库连接 打开yii的配置文件目录下的数据库配置文件config/db.php <?php return [ 'class' => 'yii\db\Connect ...

  6. Spark运行模式_local(本地模式)

    本地运行模式 (单机) 该模式被称为Local[N]模式,是用单机的多个线程来模拟Spark分布式计算,直接运行在本地,便于调试,通常用来验证开发出来的应用程序逻辑上有没有问题. 其中N代表可以使用N ...

  7. 用turtle库显示汉诺塔问题的过程

    用turtle库显示汉诺塔问题的过程 一.什么是汉诺塔问题? 一座汉诺塔,塔内有3个座A.B.C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示.把这n个盘子从A座移到C座,但每次只能移 ...

  8. ECMAScript 5 compatibility shims for legacy JavaScript engines

    ECMAScript 5 compatibility shims for legacy JavaScript engines https://github.com/es-shims/es5-shim

  9. logger 配置文件详解

    Logback配置文件详解 Logback,Java 日志框架. Logback 如何加载配置的 logback 首先会查找 logback.groovy 文件 当没有找到,继续试着查找 logbac ...

  10. OI生涯回忆录(二)

    (二)NOIP2016之后到HLOI2017 之后变得有点颓废,因为有的地方难度上来了,碰见不会的题我就会放挺.又或者有时候题水,改完了就不思进取了.到了过年前那几天连着考了几天试,好像是长春那边冬令 ...