NC16122 郊区春游
题目
题目描述
今天春天铁子的班上组织了一场春游,在铁子的城市里有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跑一下即可。
初始化一个点的状态,花费为 。记 表示要走的第 个点在全部点中的编号,随后有状态转移方程:
时间复杂度
空间复杂度
代码
#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; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/16653904.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧