タイトルの説明
平面上に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
。;を使用してください。