题目链接

题目

题目描述

今天春天铁子的班上组织了一场春游,在铁子的城市里有n个郊区和m条无向道路,第i条道路连接郊区Ai和Bi,路费是Ci。经过铁子和顺溜的提议,他们决定去其中的R个郊区玩耍(不考虑玩耍的顺序),但是由于他们的班费紧张,所以需要找到一条旅游路线使得他们的花费最少,假设他们制定的旅游路线为V1, V2 ,V3 ... VR,那么他们的总花费为从V1到V2的花费加上V2到V3的花费依次类推,注意从铁子班上到V1的花费和从VR到铁子班上的花费是不需要考虑的,因为这两段花费由学校报销而且我们也不打算告诉你铁子学校的位置。

输入描述

第一行三个整数n, m, R(2 ≤ n ≤ 200, 1 ≤ m ≤ 5000, 2 ≤ R ≤ min(n, 15))。

第二行R个整数表示需要去玩耍的郊区编号。

以下m行每行Ai, Bi, Ci(1 ≤ Ai, Bi ≤ n, Ai ≠ Bi, Ci ≤ 10000)

保证不存在重边。

输出描述

输出一行表示最小的花费

示例1

输入

4 6 3
2 3 4
1 2 4
2 3 3
4 3 1
1 4 1
4 2 2
3 1 6

输出

3

题解

知识点:状压dp,最短路。

经典TSP问题,不过因为不是走完所有点,而是走完给定的点即可,因此要先处理出需要走的点之间的最短路,floyd跑一下即可。

初始化一个点的状态,花费为 \(0\) 。记 \(a[i]\) 表示要走的第 \(i\) 个点在全部点中的编号,随后有状态转移方程:

\[dp[i][j] = \min(dp[i][j], dp[i \wedge (1 << (j - 1))][k] + g[a[k]][a[j]])
\]

时间复杂度 \(O(nm + n^3+r^22^r)\)

空间复杂度 \(O(nm + r2^r)\)

代码

#include <bits/stdc++.h>

using namespace std;

int a[20], g[207][207], dp[1 << 16][20];

int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m, r;
cin >> n >> m >> r; for (int i = 1;i <= r;i++)
cin >> a[i]; memset(g, 0x3f, sizeof(g));
for (int i = 1;i <= n;i++) g[i][i] = 0;
for (int i = 1;i <= m;i++) {
int u, v, w;
cin >> u >> v >> w;
g[v][u] = g[u][v] = w;
} ///floyd预处理各点最短路,O(n^3)
for (int k = 1;k <= n;k++)
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
g[i][j] = min(g[i][j], g[i][k] + g[k][j]); memset(dp, 0x3f, sizeof(dp));
for (int i = 1;i <= r;i++) dp[1 << (i - 1)][i] = 0;///初始化,每个点都可以是起点
for (int i = 0;i < (1 << r);i++) {
for (int j = 1;j <= r;j++) {
if (!(i & (1 << (j - 1)))) continue;
for (int k = 1;k <= r;k++) {
if (j != k && !(i & (1 << (k - 1)))) continue;
dp[i][j] = min(dp[i][j], dp[i ^ (1 << (j - 1))][k] + g[a[k]][a[j]]);
}
}
}
int ans = ~(1 << 31);
for (int i = 1;i <= r;i++) ans = min(ans, dp[(1 << r) - 1][i]);
cout << ans << '\n';
return 0;
}

NC16122 郊区春游的更多相关文章

  1. BZOJ2720: [Violet 5]列队春游

    2720: [Violet 5]列队春游 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 173  Solved: 125[Submit][Status] ...

  2. BZOJ 2720: [Violet 5]列队春游

    2720: [Violet 5]列队春游 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 189  Solved: 133[Submit][Status] ...

  3. NGK八大板块:为何郊区市场近来火爆?-VALAITIS, PETER ANTHONY分析

    PAUL ADAMS ARCHITECT LTD董事长VALAITIS, PETER ANTHONY称受大环境影响很多纽约人都选择离开纽约市中心,搬往附近郊区,因此附近地区楼市开始不断升温. 根据房地 ...

  4. BZOJ 2720 [Violet 5]列队春游 ——期望DP

    很喵的一道题(我可不是因为看了YOUSIKI的题解才变成这样的) $ans=\sum_{x<=n}\sum_{i<=n} iP(L=i)$ 其中P(x)表示视线为x的概率. 所以只需要求出 ...

  5. bzoj2720: [Violet 5]列队春游(概率期望+组合数学)

    Description Input Output Sample Input   Sample Output   HINT 数学题都这么骚的么……怎么推出来的啊……我是真的想不出来…… 首先,要算总的视 ...

  6. 【BZOJ2070】列队春游———[组合数学+概率DP]

    数学渣滓不可做の题OTZ Description (单身人士不可做 Input                     |            Output 3                   ...

  7. 【算法】(查找你附近的人) GeoHash核心原理解析及代码实现

    本文地址 原文地址 分享提纲: 0. 引子 1. 感性认识GeoHash 2. GeoHash算法的步骤 3. GeoHash Base32编码长度与精度 4. GeoHash算法 5. 使用注意点( ...

  8. Hilbert-Huang Transform(希尔伯特-黄变换)

    在我们正式开始讲解Hilbert-Huang Transform之前,不妨先来了解一下这一伟大算法的两位发明人和这一算法的应用领域 Section I 人物简介 希尔伯特:公认的数学界“无冕之王”,1 ...

  9. asp.net MVC4——省市三级联动数据库

    数据库设计

  10. Java多线程整理(li)

    目录: 1.volatile变量 2.Java并发编程学习 3.CountDownLatch用法 4.CyclicBarrier使用 5.BlockingQueue使用 6.任务执行器Executor ...

随机推荐

  1. 如何使用 Helm 在 K8s 上集成 Prometheus 和 Grafana|Part 3

    在本教程的前两部分,我们分别了解和学习了Prometheus 和 Grafana 的基本概念和使用的前提条件,以及使用 Helm 在 Kubernetes 上安装 Prometheus. 在今天的教程 ...

  2. 【C++】类大小

    [来源]C++类大小详尽讲解 [来源]空类(empty class)

  3. SpringMVC08——拦截器——2021-05-11

    拦截器概述 SpringMVC的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并做相应的处理. 例如:进行权限验证.记录请求信息的日志.判断用户 ...

  4. [转帖]从Linux源码看TIME_WAIT状态的持续时间

    https://zhuanlan.zhihu.com/p/286537295 从Linux源码看TIME_WAIT状态的持续时间 前言 笔者一直以为在Linux下TIME_WAIT状态的Socket持 ...

  5. [转帖]Linux 下rsync命令详细整理

    https://blog.csdn.net/weixin_44052462/article/details/116134761 rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面 ...

  6. Oracle process/session/cursor/tx/tm的简单学习

    Oracle process/session/cursor/tx/tm的简单学习 Oracle的部署模式 Oracle安装时有专用模式和共享模式的区别 共享模式(Shared mode): 在共享模式 ...

  7. [转帖]060-轻量级基于curl的seafile上传脚本

    https://anjia0532.github.io/2021/04/07/seafile-client-curl/ 这是坚持技术写作计划(含翻译)的第 60 篇,定个小目标 999,每周最少 2 ...

  8. [转帖]MySQL InnoDB存储引擎大观

      https://baijiahao.baidu.com/s?id=1709263187856706948&wfr=spider&for=pc MySQL InnoDB 引擎现在广为 ...

  9. [转帖]Linux中./configure、make、make install命令详解

    简单来说,make 是编译,make install 是安装.   总结:linux编译安装中configure.make和make install各自的作用  • ./configure是用来检测你 ...

  10. Nginx调优总结-第六部分编译优化与简单测试

    第六部分 编译优化 Nginx可以自行编译,所以里面可以设置多个编译策略. 也可以自行修改源码,便于比如进行ip_hash的全IP地址验证. 也可以修改nginx的版本号等信息, 避免内发现. 还可以 ...