UVA10702 Travelling Salesman 题解

 UVA10702 Travelling Salesman 题解

题面:

有个旅行的商人,他每到一个的新城市,便卖掉所有东西再购买新东西,从而获得利润。从某城市 A 到某城市 B 有固定利润(B 到 A 的利润可能不同)。已知城市可以重复到达,从 S 点出发,经过 个城市,有 E 个城市能作为终点,求最大的利润。

先定义状态: dp [ i ][ j ]  为走过 i 个城市,在 j 结束时的最大利润;

此时我们可以进一步推出转移方程:

dp [ i ][ j ] = \max (dp [ i - 1 ][ k ] + w [ k ][ j ])


贴代码:

复制代码
#include <bits/stdc++.h>
const int MINN = -0x3f;
//TSP旅行商问题
int w[101][101], end[101], dp[101][101], x, C, S, E, T, tot;

int main() {
while (~scanf("%d%d%d%d", &C, &S, &E, &T) && C + S + E + T) {

for (int i = 1; i <= C; i++) {
for (int j = 1; j <= C; j++) {
scanf("%d", &w[i][j]);
}
end[i] = 0;
}
for (int i = 1; i <= E; ++ i) {
scanf("%d", &x);
end[x] = 1;
}
for (int i = 0; i <= T; ++ i) {
for (int j = 1; j <= C; ++ j) {
dp[i][j] = MINN;
}
}
//记得预处理dp数组
dp[0][S] = 0;
for (int i = 1; i <= T; ++ i) {
for (int j = 1; j <= C; ++ j) {
for (int k = 1; k <= C; ++ k) {
if (dp[i][j] < dp[i - 1][k] + w[k][j] && w[k][j] != 0) {
dp[i][j] = dp[i - 1][k] + w[k][j];
}
}
}
}
for (int i = 1; i <= C; ++ i) {
if (tot < dp[T][i] && end[i] != 0) {
tot = dp[T][i];
}
}
printf("%d\n", tot);
}
return 0;
}
复制代码

 

后置知识:

Travelling Salesman Problem(TSP)是经典的路线问题。它寻求的是旅行者由起点出发,通过所有给定的需求点后,再次返回起点所花费的最小路径成本,也叫旅行商问题。

TSP问题是有 NP 难度的,没有多项式时间的高效解法,所以 TSP 给的 n(城市数)一般都很小。

 

posted @   Miya555  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示
主题色彩