首页 > 其他分享 >P1523 旅行商简化版

P1523 旅行商简化版

时间:2022-12-24 13:33:07浏览次数:53  
标签:旅行 dist P1523 min int 简化版 rep double include

简化题意:

给定 \(n\) 个点,要求从最左端的点到最右端的点之间寻找两条互不重复的路径,两条路径经过所有点,且路径长度最小。输出最短路径长度。

思路:

动态规划。

应该也算比较套路了。设想有两个人同时从最左端的点开始走,设 \(f_{i, j}\) 表示第一个人走到了 \(i\) 点,第二个人走到了 \(j\) 点。为了简化问题,我们假设 \(i < j\),且 \(1 \sim j\) 中所有的点都已经被走过了。接下来,我们考虑 \(j + 1\) 号点会被谁走。

  1. \(j\) (也就是第二个人) 走了 \(j + 1\) 号点。这样显然是可以的。状态转移方程为 f[i][j + 1] = min(f[i][j + 1], f[i][j] + dist(j, j + 1));

  2. \(i\) (也就是第一个人) 后来居上,直接走到了 \(j + 1\) 号点。这样我们的第一个和第二个人就要对调一下了。因为我们定义前后,是根据他们目前所在点横坐标的大小。这样直接对调并不影响结果。状态转移 f[j][j + 1] = min(f[j][j + 1], f[i][j] + dist(i, j + 1));

代码示例:

// 缺省源没有去掉,大家凑付看看吧
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define x first
#define y second
#define rep(i, a, b) for (int i = (a); i <= (b); i ++ )
#define rop(i, a, b) for (int i = (a); i < (b); i ++ )

using namespace std;

using PDD = pair<double, double>;

const int N = 1010;
double f[N][N];
int n; PDD p[N];

double dist(int a, int b) {
	double dx = p[a].x - p[b].x;
	double dy = p[a].y - p[b].y;
	return sqrt(dx * dx + dy * dy);
}

int main() {
	scanf("%d", &n);
	rep(i, 1, n)
		scanf("%lf%lf", &p[i].x, &p[i].y);
	sort(p + 1, p + n + 1); // 不要忘了按照横坐标排序,确保是从西向东走
	
	rep(i, 1, n) rep(j, i + 1, n)
		f[i][j] = 1145141919810.00 * 20221224.00;
	
	f[1][2] = dist(1, 2);
	rep(i, 1, n) rep(j, i + 1, n)
		f[i][j + 1] = min(f[i][j + 1], f[i][j] + dist(j, j + 1)),
		f[j][j + 1] = min(f[j][j + 1], f[i][j] + dist(i, j + 1));
	double res = 1145141919810.00 * 20221224.00;
	rop(i, 1, n) res = min(res, f[i][n] + dist(i, n));
	printf("%.2lf", res);
	return 0;
}

标签:旅行,dist,P1523,min,int,简化版,rep,double,include
From: https://www.cnblogs.com/LcyRegister/p/17002799.html

相关文章

  • [JSOI2013]旅行时的困惑
    链接:https://www.luogu.com.cn/problem/P5258题目描述:给定一颗有向树,求至少多少条有向路径可以覆盖整颗树(有向路径可以相交)题解:路径的覆盖,我们容易想到赛道修建那样的......
  • 「NOIP2012」开车旅行
    「NOIP2012」开车旅行题面描述:小\(A\)与小\(B\)开车旅行,两个点的距离是两个点的高度的差的绝对值,若两个点的距离相同,则认为海拔低的要更近,小\(A\)以离他次近的点作......
  • [JSOI2013]旅行时的困惑
    链接:https://www.luogu.com.cn/problem/P5258题目描述:给定一颗有向树,求至少多少条有向路径可以覆盖整颗树(有向路径可以相交)题解:路径的覆盖,我们容易想到赛道修建那样......
  • [JSOI2010]旅行
    链接:https://www.luogu.com.cn/problem/P6029题目描述:给定一个$n$个$m$条边的无向图,可以交换$k$组边,求$1$到$n$的最短路。题解:发现值域都比较小,考虑$dp$。我们可以......
  • python奇妙旅行之4行代码生成图像验证码
    在学习的路上,永无止境。就好比人掉进"深渊",永远无法自拔!  ~ ~!我没有开车,我没有开车~~~今天空闲时间再看某大佬得论坛,被点了一下,就想起来了2种方法,生成图片验证码,简约......
  • 2022 最新海南岛旅行攻略 All In One
    2022最新海南岛旅行攻略AllInOne海南岛面积约3.54万平方公里,人口约940多万。人口GDPhttps://www.hainan.gov.cn/hainan/zfsj/xsj.shtmlhttps://www.hainan.......
  • 1088. 旅行问题
    题目链接1088.旅行问题John打算驾驶一辆汽车周游一个环形公路。公路上总共有\(n\)个车站,每站都有若干升汽油(有的站可能油量为零),每升油可以让汽车行驶一千米。John......
  • 旅行二
      ★实验任务王尼玛又想出去旅游了,由于王尼玛是个抠门的人,所以王尼玛想要花最少的钱去一个自己想去的地方。王尼玛决定使用火车去旅行,地图上总共有n个城市,其中有k个......
  • java最容易理解的旅行售货员问题
    packageNqueen;publicclasszuiduanluxian{/***旅行售货员问题--回溯法*@authorLican**/publicstaticclassBttsp{//建立一个javabean类而且是......
  • P8855 [POI2002]商务旅行
    简要题意给出一个\(N\)个节点的树和一个长度为\(M\)的序列\(S\)。你需要从\(1\)出发,依次经过\(S\)中的所有点,求至少需要经过的边数。\(1\leN\le30000\)思......