其他分享
首页 > 其他分享> > 最短路径问题(信息学奥赛一本通 - T1342)

最短路径问题(信息学奥赛一本通 - T1342)

作者:互联网

题目描述
平面上有 n 个点,每个点的坐标均在 -10000 ~ 10000 之间,其中的一些点之间有连线。

若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。

现在的任务是找出从一点到另一点之间的最短路径。

输入格式
第一行为整数 n。
第 2 行到第 n + 1 行,每行两个整数 x 和 y,描述了一个点的坐标。
第 n + 2 行为一个整数 m,表示图中连线的个数。
此后的 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

数据范围
n ≤ 100


题解
Floyd:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;

typedef pair<int, int> PII;

const int N = 110;
const double INF = 0x3f3f3f3f;

PII g[N];
int n, m, s, e;
double d[N][N];

double get(int a, int b)
{
	int x = g[a].first - g[b].first;
	int y = g[a].second - g[b].second;
	return sqrt(x * x + y * y);
}

void floyd()
{
	for (int k = 1; k <= n; k ++)
		for (int i = 1; i <= n; i ++)
			for (int j = 1; j <= n; j ++)
				if(d[i][k] != INF && d[k][j] != INF)
					d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}

int main()
{
	cin >> n;	
	for (int i = 1; i <= n; i ++) cin >> g[i].first >> g[i].second;	
	cin >> m;
	
	for (int i = 1; i <= n; i ++)
	    for (int j = 1; j <= n; j ++)
	        if(i != j) d[i][j] = INF;
	
	while(m --)
	{
		int a, b;
		cin >> a >> b;
		d[a][b] = d[b][a] = min(d[a][b], get(a, b));
	}
	
	cin >> s >> e;
	
	floyd();
				
	printf("%.2f", d[s][e]);
	return 0;
}

标签:信息学,连线,int,cin,整数,T1342,奥赛,include,first
来源: https://blog.csdn.net/weixin_46239370/article/details/113822608