最短経路問題(情報オリンピックワンブックパス-T1342)

タイトルの説明
平面上にn個の点があり、各点の座標は-10000〜10000であり、それらの間に線があるものもあります。

接続線がある場合は、あるポイントから別のポイントに到達できることを意味します。つまり、2つのポイント間にパスがあり、パスの距離は2つのポイント間の直線距離です。

ここでのタスクは、あるポイントから別のポイントへの最短パスを見つけることです。

入力形式
最初の行は整数nです。
2行目からn + 1行目まで、各行には、点の座標を表す2つの整数xとyが含まれています。
n + 2行目は整数mで、図の行数を表します。
次のm行では、各行は2つの整数iとjで構成される接続を示しており、i番目のポイントとj番目のポイントの間に接続があることを示しています。
最後の行:それぞれソースポイントとターゲットポイントを表す2つの整数sとt。

出力形式
1行、1つの実数(小数点以下2桁)は、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


問題解決
フロイド:

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

typedef pair<int, int> PII;

const int N = 110, INF = 0x7f7f7f7f;

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;
	
	memset(d, 0x7f, sizeof d);
	for (int i = 1; i <= n; i ++) d[i][i] = 0;
	
	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;
}

ps:double配列のタイプを0x3f初期化できません0x7f。;を使用してください

おすすめ

転載: blog.csdn.net/weixin_46239370/article/details/113822608
おすすめ