最短路径问题

平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间,其中的一些点之间有连线。

若有连线,则表示可从一个点到达另一个点,即两点间有通路,同路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短路径。

小提示:

  1. 两点的距离:如果点\(A\)坐标为\((x_A,y_A)\),点\(B\)的坐标为\((x_B,y_B)\)\(dis(A,B) = \sqrt{ (x_A-x_B)^2+(y_A-y_B)^2}\)
    C++中求根使用sqrt();
  2. 保留两位小数:使用double变量,double ans;print("%.2lf",ans);

输入

共n+m+3行。

  • 第 1 行:整数n

  • 第2行到第n+1行(共n行),每行两个整数x和y,描述一个点的坐标。

  • 第n+2行为一个整数m,\(m \leq 1000\),表示图中连线的个数。

  • 此后的m行,每行描述一条连线,由两个整数i和j组成,表示第i个点和第j个点之间有连线。

  • 最后一行:两个整数s和t,分别表示源点和目标点。两个数之间用一个空格隔开。

输出

仅一行,一个实数(保留两位小数),表示从s到t的最短路径长度。


样例输入

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

样例输出

3.41



#include <bits/stdc++.h>
using namespace std;
int a,b,n,m,vis[10010],x[10010],y[10010];
double dis[10010];
bool d[1100][1100];
queue<int> q;
void bfs()
{
	q.push(a);
	dis[a]=0;
	vis[a]=1;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		vis[u]=1;
		for(int i=1;i<=b;i++)
		{
			if(d[u][i]&&!vis[i])
			{
				q.push(i);
				dis[i]=dis[u]+sqrt(double(x[i]-x[u])*double(x[i]-x[u])+double(y[i]-y[u])*double(y[i]-y[u]));
				vis[i]=1;
				if(i==b)
				{
					cout << fixed << setprecision(2) << dis[i];
					return;
				}
			}
		}
	}
}
int main()
{
	cin >> n;
	for(int i=1;i<=n;i++)
	{
		cin >> x[i] >> y[i];
	}
	cin >> m;
	for(int i=1;i<=m;i++)
	{
		int f,ff;
		cin >> f >> ff;
		d[f][ff]=d[ff][f]=1;
	}
	cin >> a >> b;
	bfs();
	return 0;
}

原文链接:https://www.cnblogs.com/momotrace/p/shortest-road_pr.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:最短路径问题 - Python技术站

(0)
上一篇 2023年4月24日
下一篇 2023年4月24日

相关文章

  • C++文件处理

    ? 新建文件 //这是要操作的文件名称 string str_filename = “E:/data/t/haha.txt”; //创建一个流对象 o 就是从这个流对象出去, 出到哪里, 当然是我们要建立的文件 ofstream ofs; //out会覆盖 ofs.open(str_filename, ios::out); ofs << “我创建…

    C++ 2023年4月17日
    00
  • Qt源码阅读(四) 事件循环

    事件系统 文章为本人理解,如有理解不到位之处,烦请各位指正。 @ 目录 事件系统 什么是事件循环? 事件是如何产生的? sendEvent postEvent 事件是如何处理的? 事件循环是怎么遍历的? 事件过滤器 event 夹带私货时间 Qt的事件循环,应该是所有Qter都避不开的一个点,所以,这篇博客,咱们来了解源码中一些关于Qt中事件循环的部分。先抛…

    C++ 2023年4月18日
    00
  • C++/Qt网络通讯模块设计与实现(六)

    前面章节主要讲述网络通讯客户端的实现,各位小伙伴需认真阅读以及理解,理会其中的思想,有疑问的地方可及时给我私信,我都会非常认真地解答大家的疑惑。 C++/Qt网络通讯模块设计与实现(一) C++/Qt网络通讯模块设计与实现(二) C++/Qt网络通讯模块设计与实现(三) C++/Qt网络通讯模块设计与实现(四) C++/Qt网络通讯模块设计与实现(五) 这节…

    C++ 2023年4月18日
    00
  • 【Visual Leak Detector】配置项 SelfTest

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍 VLD 配置文件中配置项 SelfTest 的使用方法。 同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 配置文件使用说明 2. 设置是否开启泄漏自检 2.1 测试代码 2.2 SelfTest = off 时的输出 2.3 SelfTest = on 时的输出 2.4 …

    C++ 2023年4月18日
    00
  • 【Visual Leak Detector】配置项 TraceInternalFrames

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍 VLD 配置文件中配置项 TraceInternalFrames 的使用方法。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 配置文件使用说明 2. 设置是否跟踪内部堆栈的调用 2.1 测试代码 2.2 TraceInternalFrames = no 时的输出 2.3 …

    C++ 2023年4月18日
    00
  • 关于自定义Base64编解码的实现

    什么是Base64 Base64编码是将字符串以每3个8比特(bit)的字节子序列拆分成4个6比特(bit)的字节(6比特有效字节,最左边两个永远为0,其实也是8比特的字节)子序列,再将得到的子序列查找Base64的编码索引表,得到对应的字符拼接成新的字符串的一种编码方式。 每个3位8比特数据拆分成4个6比特数据过程如下图所示:      注意事项 Base…

    C++ 2023年4月18日
    00
  • C++容器(vector、deque、list、map)

    (1) vector:将元素置于一个动态数组中,可以随机存储元素(也就是用索引直接存取)。 数组尾部添加或删除元素非常迅速。但在中部或头部就比较费时。 *代码演示:* 取:at在下标越界时会抛出异常,我们能捕获异常进行处理;而[]下标越界会让程序直接终止; 构造函数: cbegin, cend, crbegin, crend返回的是常量迭代器,不能通过迭代器…

    C++ 2023年5月5日
    00
  • C++ 并发编程实战 第二章 线程管控

    第二章 线程管控 std::thread 简介 构造和析构函数 /// 默认构造 /// 创建一个线程,什么也不做 thread() noexcept; /// 带参构造 /// 创建一个线程,以 A 为参数执行 F 函数 template <class Fn, class… Args> explicit thread(Fn&&amp…

    C++ 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部