[BZOJ1097][POI2007]旅游景点atr

试题描述

FGD想从成都去上海旅游。在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情。经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个城市登山,而是希望去另外什么地方喝下午茶。幸运的是,FGD的旅程不是既定的,他可以在某些旅行方案之间进行选择。由于FGD非常讨厌乘车的颠簸,他希望在满足他的要求的情况下,旅行的距离尽量短,这样他就有足够的精力来欣赏风景或者是泡MM了^_^.整个城市交通网络包含N个城市以及城市与城市之间的双向道路M条。城市自1至N依次编号,道路亦然。没有从某个城市直接到它自己的道路,两个城市之间最多只有一条道路直接相连,但可以有多条连接两个城市的路径。任意两条道路如果相遇,则相遇点也必然是这N个城市之一,在中途,由于修建了立交桥和下穿隧道,道路是不会相交的。每条道路都有一个固定长度。在中途,FGD想要经过K(K<=N-2)个城市。成都编号为1,上海编号为N,而FGD想要经过的N个城市编号依次为2,3,…,K+1.举例来说,假设交通网络如下图。FGD想要经过城市2,3,4,5,并且在2停留的时候在3之前,而在4,5停留的时候在3之后。那么最短的旅行方案是1-2-4-3-4-5-8,总长度为19。注意FGD为了从城市2到城市4可以路过城市3,但不在城市3停留。这样就不违反FGD的要求了。并且由于FGD想要走最短的路径,因此这个方案正是FGD需要的。

输入

第一行包含3个整数N(2<=N<=20000),M(1<=M<=200000),K(0<=K<=20),意义如上所述。

输出

只包含一行,包含一个整数,表示最短的旅行距离。

输入示例

8 15 4
1 2 3
1 3 4
1 4 4
1 6 2
1 7 3
2 3 6
2 4 2
2 5 2
3 4 3
3 6 3
3 8 6
4 5 2
4 8 6
5 7 4
5 8 6
3
2 3
3 4
3 5

输出示例

19

数据规模及约定

见“输入

题解

虽然点数很多,但是我们只需要关心 K+2 个点(K 个必须停留的节点以及起点和终点)之间的最短路就好了,于是可以做最多 22 次最短路预处理处 Dis[i][j] 表示第 i 个关键点到第 j 个关键点的距离。

接下来就是 dp,f(S, i) 表示已经在集合 S 中的点停留过了,现在在节点 i 所需要的最短距离。你可以记录一个 bef[i] 表示在 i 停留之前需要停留的节点集合,然后转移的时候看看 bef[i] 是不是当前状态 S 的子集,这就是细节了。

注意特判 K = 0 的情况!!!

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <queue>
using namespace std;int read() {int x = 0, f = 1; char c = getchar();while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }return x * f;
}#define maxn 20010
#define maxm 400010
#define maxk 25
#define maxs 1048576
#define oo (1ll << 60)
#define LL long longint n, m, K, head[maxn], to[maxm], nxt[maxm], dist[maxm], idk[maxk];
LL Dis[maxk][maxk];void AddEdge(int a, int b, int c) {to[++m] = b; dist[m] = c; nxt[m] = head[a]; head[a] = m;swap(a, b);to[++m] = b; dist[m] = c; nxt[m] = head[a]; head[a] = m;return ;
}LL d[maxn];
bool vis[maxn];
struct Node {int u, d;Node() {}Node(int _, int __): u(_), d(__) {}bool operator < (const Node& t) const { return d > t.d; }
};
priority_queue <Node> Q;
void ShortPath(int si) {int s = idk[si];for(int i = 1; i <= n; i++) d[i] = oo;memset(vis, 0, sizeof(vis));d[s] = 0; Q.push(Node(s, 0));while(!Q.empty()) {int u = Q.top().u; Q.pop();if(vis[u]) continue;vis[u] = 1;for(int e = head[u]; e; e = nxt[e]) if(d[to[e]] > d[u] + dist[e]) {d[to[e]] = d[u] + dist[e];if(!vis[to[e]]) Q.push(Node(to[e], d[to[e]]));}}for(int i = 1; i <= K + 2; i++) if(i != si) Dis[si][i] = d[idk[i]];return ;
}int bef[maxk];LL f[maxs][maxk];
void up(LL& a, LL b) {a = min(a, b);return ;
}int main() {n = read(); int m = read(); K = read();for(int i = 1; i <= m; i++) {int a = read(), b = read(), c = read();AddEdge(a, b, c);}for(int i = 2; i <= K + 1; i++) idk[i-1] = i;idk[K+1] = 1; idk[K+2] = n;m = read();for(int i = 1; i <= m; i++) {int a = read() - 1, b = read() - 1;bef[b] |= (1 << a - 1);}for(int i = 1; i <= K + 2; i++) ShortPath(i);int all = (1 << K) - 1;for(int S = 0; S <= all; S++)for(int i = 1; i <= K; i++) f[S][i] = oo;for(int i = 1; i <= K; i++) if(!bef[i]) f[1<<i-1][i] = Dis[K+1][i];for(int S = 0; S <= all; S++)for(int i = 1; i <= K; i++) if(f[S][i] < oo)for(int j = 1; j <= K; j++) if((S >> j - 1 & 1) == 0 && (S & bef[j]) == bef[j])up(f[S|(1<<j-1)][j], f[S][i] + Dis[i][j]);LL ans = oo;for(int i = 1; i <= K; i++) if(f[all][i] < oo) up(ans, f[all][i] + Dis[i][K+2]);printf("%lld\n", K ? ans : Dis[1][2]);return 0;
}

转载于:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/6726013.html

[BZOJ1097][POI2007]旅游景点atr相关推荐

  1. 【BZOJ-1097】旅游景点atr SPFA + 状压DP

    1097: [POI2007]旅游景点atr Time Limit: 30 Sec  Memory Limit: 357 MB Submit: 1531  Solved: 352 [Submit][S ...

  2. BZOJ 1097 [POI2007]旅游景点atr

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1097 思路 kk很小,考虑状压. 预处理出从11-(k+1)(k+1)出发,到其他点的距 ...

  3. Python告诉你这些旅游景点好玩、便宜、人又少!

    (图片由CSDN付费下载自东方IC) 作者 | 猪哥 来源 | 裸睡的猪(ID:IT--Pig) 2019年国庆马上就要到来, 今年来点新花样吧, 玩肯定是要去玩的, 不然怎么给祖国庆生? 那去哪里玩 ...

  4. [Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒

    前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒,同样可以通过Spider获取网站内容,最近学习了Selenium+Phantomjs后,准备利用它们获取百度百科的旅游景点消息盒(I ...

  5. 题解 T28305 【yizimi的旅游景点】

    题目链接这里!!! AC军团月赛题目地址这里!!!正比例函数的旅游景点 题目翻译 我依然不会告诉你题目的难度有一半是读题 其实就是给定一个图中一部分点,给定一部分边,先让你求这之中的最小生成树,然后再 ...

  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的旅游景点酒店预订网站设计

    项目功能: 系统分为前台和后台,系统主要分为如下模块: 旅游网站主要是利用可靠的技术实现游客信息管理的自动化.系统化.标准化,为旅行社或旅游公司针对客户信息制订出的经营构建了一个高效的信息管理系统.该 ...

  7. 旅游景点、住宿带餐饮一天一万多流水能做到吗?

    首先,住宿餐饮都是旅游景区的热门行业 退休后,我和老伴经常在外自驾游,对于景点的好坏,喜欢与不喜欢,其衡量的标准就有住宿和餐饮.这样说吧,距离景点近,饭菜干净,停车安全就行,至于价格不要太离谱就行.我 ...

  8. Python 分析国庆热门旅游景点,告诉你哪些地方好玩、便宜、人又少!

    作者 | 裸睡的猪 责编 | 屠敏 2019年国庆马上就要到来, 今年来点新花样吧, 玩肯定是要去玩的, 不然怎么给祖国庆生? 那去哪里玩?人少档次还高呢? 咱不是程序员嘛, 那就用数据分析下, 看看 ...

  9. 基于html+css+javascript+jquery+bootstarp响应式网页设计——大理我的家乡旅游景点

    家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套.浮动.margin.border.background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大 ...

最新文章

  1. 一起来了解React的四种优秀甘特图方案(下篇)
  2. this和that的区别和原理
  3. 在Digital Ocean上的MongoDB
  4. 学习python需要什么基础-学习python需要什么基础
  5. 四大发明之活字印刷——面向对象思想的胜利
  6. 对Angular使用了HttpClient的服务进行单元测试
  7. STL中map的使用要点
  8. 110_Power Pivot特殊结算日期及财年日期
  9. Spring Boot application.yml文件语法
  10. windows知识点
  11. *printf()格式化串安全漏洞分析(上)
  12. python爬取网易云音乐付费音乐_python爬虫学习教程,爬取网易云音乐!
  13. HiveQL(三):修改表ALTER TABLE
  14. 网络与多媒体机基础知识易错知识点汇总
  15. CAD打印后图形不显示?
  16. 微信小程序生成分享海报
  17. linux中ftp禁止匿名,linux下禁止root和匿名用户登录ftp
  18. 美团外卖uml流程图_以美团外卖为例,区别业务流程图和页面流程图
  19. USB-SC-09(假冒PL2303HXA芯片)WIN7-64位驱动之终极大法
  20. Bias和Variance

热门文章

  1. 防火墙(12)——查看协议被连接的次数、通过连接状态来写规则
  2. iOS Hacker Xcode玩转arm64汇编基础
  3. POJ 1904 King's Quest(强连通分量)
  4. mysql 锁命令_MySQL锁定状态查看命令
  5. nullptr/nullptr_t
  6. Linux信号量之用户态信号量(Posix信号量->无名信号量)
  7. c++动态内存的几个简单例子
  8. Nested `constexpr` function calls before definition in a constant-expression context
  9. [转] CMake入门
  10. HEVC-CABAC