Problem: 八中的厕所

本文介绍了一种解决平面内多个点(代表厕所)间最短路径问题的方法。通过使用图论中的迪杰斯特拉算法,计算两点间的最短距离,并提供了一个具体的实现示例。

Problem: 八中的厕所

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 468   Solved: 257
[ Submit][ Status][ Web Board]

Description

平面上有n个厕所(n<=100),每个厕所的坐标均在-10000~10000之间。其中的一些厕所之间有屎连接。若有连接,则表示可从一个厕所吃到另一个厕所,即两厕所间有通路,通路的距离为两厕所间的直线距离。现在的任务是找出从一厕所到另一厕所之间的最短路径。

Input

共n+m+3行,其中:
第一行为整数n。
第2行到第n+1行(共n行),每行两个整数x和y,描述了一个点的坐标。
第n+2行为一个整数m,表示图中连线的个数。
此后的m行,每行描述一条连线,由两个整数i和j组成,表示第i个点和第j个点之间有连线。
最后一行:两个整数s和t,分别表示源点和目标点。

Output

仅一行,一个实数(保留两位小数),表示从s到t的ZY最少的吃屎量。

Sample Input

5
0 0
2 0
2 2
0 2
3 1
5
1 2
1 3
1 4
2 5
3 5
1 5

Sample Output

3.41

HINT

[ Submit][ Status]
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
struct node {
	double x,y;
} a[1001];
double dis[1001],map[101][101];
int vis[1001],n;
void D(int u) {
	memset(vis,0,sizeof(vis));
	for(int i=1; i<=n; i++)
		dis[i]=map[u][i];
	dis[u]=0;
	vis[u]=1;
	for(int i=1; i<n; i++) {
		double minn=1e9;
		int k=-1;
		for(int j=1; j<=n; j++)
			if((dis[j]<=minn)&&vis[j]==0)
				minn=dis[k=j];
		vis[k]=1;
		for(int j=1; j<=n; j++)
			if((dis[j]>=dis[k]+map[k][j])&&vis[j]==0)
				dis[j]=dis[k]+map[k][j];
	}
}
int main() {
	memset(map,127,sizeof(map));
	memset(dis,127,sizeof(dis));
	scanf("%d",&n);
	for(int i=1; i<=n; i++)
		scanf("%lf %lf",&a[i].x,&a[i].y);
	int m;
	scanf("%d",&m);
	for(int i=1; i<=m; i++) {
		int p,q;
		scanf("%d %d",&p,&q);
		double y=sqrt(pow(a[p].x-a[q].x,2)+pow(a[p].y-a[q].y,2));
		map[q][p]=map[p][q]=y;
	}
	int u,v;
	scanf("%d %d",&u,&v);
	D(u);
	printf("%0.2lf",dis[v]);
}
<think>好的,我现在需要解决用户提到的Ceres库中关于`Problem`构造函数链接错误的问题。首先,用户提到在正常安装Ceres后,出现`undefined reference to ceres::Problem::Problem()`的错误,并且尝试过调整gcc版本和依赖项,但最终发现是链接库的问题。我需要根据这些信息,逐步分析可能的原因并提供解决方案。 首先,我需要回忆Ceres Solver的安装和使用过程。Ceres是一个需要依赖多个库的非线性优化库,比如Eigen、glog、gflags等。链接错误通常意味着编译器在链接阶段找不到对应的符号,即对应的库没有被正确链接到项目中。 用户遇到的错误是构造函数未定义,这表明`ceres::Problem`的构造函数在链接时找不到实现。可能的原因有几个: 1. **Ceres库未正确安装**:可能安装过程中出现了问题,导致库文件缺失或损坏。 2. **链接顺序问题**:在编译命令中,库的链接顺序不正确,可能导致某些符号无法被正确解析。 3. **缺少必要的依赖库**:除了Ceres本身,可能还需要链接其依赖的其他库,如Eigen、SuiteSparse等。 4. **编译器选项错误**:例如,没有启用C++11或更高版本,或者链接路径不正确。 根据引用[2]中的情况,用户已经排除了gcc版本和依赖项缺失的问题,最后发现是链接库写错了。这说明问题可能出在编译命令中的链接库参数部分。例如,可能没有正确指定`-lceres`,或者链接顺序有误。 接下来,我需要给出具体的解决步骤。首先,确保Ceres已经正确安装。可以通过运行`pkg-config --modversion ceres`来检查版本,确认安装是否成功。如果安装正确,接下来检查编译命令。 在编译时,正确的链接命令应该包含`-lceres`,并且可能需要其他依赖库,如`-lglog`、`-lgflags`等。此外,Ceres可能需要C++11支持,所以编译命令中需要添加`-std=c++11`。同时,确保链接顺序正确,通常将主程序的目标文件放在前面,库文件放在后面。例如: ```bash g++ your_program.cpp -o your_program -std=c++11 -lceres -lglog -lgflags ``` 如果用户使用CMake进行项目构建,需要在CMakeLists.txt中正确添加Ceres的依赖。例如: ```cmake find_package(Ceres REQUIRED) include_directories(${CERES_INCLUDE_DIRS}) target_link_libraries(your_target ${CERES_LIBRARIES}) ``` 此外,用户可能忘记链接其他必要的依赖库,例如`-lcholmod`、`-lcxsparse`等,具体取决于Ceres的配置。检查Ceres安装时的配置,确认哪些库需要被链接。 最后,用户需要确保所有库的路径都被正确包含,尤其是如果Ceres安装在非标准路径下,需要使用`-L`指定库路径,例如`-L/usr/local/lib`。 总结可能的解决方案步骤: 1. 确认Ceres正确安装。 2. 检查编译命令中的链接库参数是否正确,包括顺序和依赖项。 3. 确保使用C++11或更高标准。 4. 在CMake中正确配置Ceres的依赖。 5. 添加所有必要的依赖库。 此外,用户提到引用[1]中的问题涉及MPI库的链接错误,解决方法可能与库的链接顺序或添加缺失的库有关,这同样适用于Ceres的问题,需要确保所有相关的库都被正确链接。 最后,生成相关问题,帮助用户深入理解可能遇到的类似问题。</think>### 解决Ceres库中`Problem`构造函数的链接错误 出现`undefined reference to ceres::Problem::Problem()`错误通常与**链接阶段未正确包含Ceres库或其依赖项**有关。以下是分步解决方案: 1. **确认Ceres安装正确性** - 检查Ceres是否安装成功: ```bash pkg-config --modversion ceres # 输出版本号则安装正确 ``` - 若未安装,参考[官方文档](http://ceres-solver.org/installation.html)重新编译安装。 2. **检查编译命令的链接参数** - **手动编译时**需添加`-lceres`和依赖库: ```bash g++ your_code.cpp -o output -std=c++11 -lceres -lglog -lgflags -lcholmod -lcxsparse ``` - **关键点**: - 使用`-std=c++11`或更高标准(Ceres依赖C++11)。 - 按顺序链接库:主程序文件在前,库在后[^2]。 - 添加必要依赖项如`-lglog`(日志库)、`-lgflags`(命令行参数解析)等。 3. **CMake项目配置** 在`CMakeLists.txt`中正确声明依赖: ```cmake find_package(Ceres REQUIRED) include_directories(${CERES_INCLUDE_DIRS}) add_executable(your_target your_code.cpp) target_link_libraries(your_target ${CERES_LIBRARIES}) ``` - 若依赖SuiteSparse,需额外添加: ```cmake target_link_libraries(your_target ${CERES_LIBRARIES} cholmod cxsparse) ``` 4. **验证库路径** - 若Ceres安装在自定义路径(如`/opt/ceres`),需指定路径: ```bash g++ your_code.cpp -o output -I/opt/ceres/include -L/opt/ceres/lib -lceres ``` 5. **案例参考** - 用户曾因遗漏`-lglog`导致相同错误,添加后解决[^2]。 - 类似错误(如MPI库未链接)需检查符号来源库[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值