POJ 2560 Freeckles Prime問題解決アルゴリズム
1616 ワード
この問題は最小生成樹を求めています.
ノードの座標を指定すると、各点間のこれらの座標から距離を計算する必要があります.
これ以外は標準的なPrimeアルゴリズムであり、基本的にはPrimeを利用して、Kruskyalを使用することができます.
経典の計算方法は必ず記入して、熟練度.さもなくば、それは非常に難しい利用です.
しかも経典の計算方はなぜ経典ですか?その理由の一つは、自分で勝手に想像していないからです.
ノードの座標を指定すると、各点間のこれらの座標から距離を計算する必要があります.
これ以外は標準的なPrimeアルゴリズムであり、基本的にはPrimeを利用して、Kruskyalを使用することができます.
経典の計算方法は必ず記入して、熟練度.さもなくば、それは非常に難しい利用です.
しかも経典の計算方はなぜ経典ですか?その理由の一つは、自分で勝手に想像していないからです.
#include <stdio.h>
#include <string.h>
#include <queue>
#include <float.h>
#include <algorithm>
#include <math.h>
using namespace std;
struct Point
{
float x, y;
};
const int MAX_N = 101;
Point P[MAX_N];
bool vis[MAX_N];
float dist[MAX_N];
float minDist[MAX_N];
float calDist(Point &a, Point &b)
{
float x = a.x - b.x;
float y = a.y - b.y;
return sqrtf(x*x + y*y);
}
void Prime(int n)
{
memset(vis, 0, sizeof(bool) * (n+1));
vis[1] = true;
dist[1] = 0;
for (int i = 2; i <= n; i++)
{
dist[i] = calDist(P[1], P[i]);
}
for (int i = 1; i < n; i++)
{
float minD = FLT_MAX;
int id = 0;
for (int j = 2; j <= n; j++)
{
if (!vis[j] && dist[j] < minD)
{
minD = dist[j];
id = j;
}
}
vis[id] = true;
minDist[i] = minD;
for (int j = 2; j <= n; j++)
{
if (!vis[j])
{
float d = calDist(P[id], P[j]);
if (d < dist[j]) dist[j] = d;
}
}
}
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%f %f", &P[i].x, &P[i].y);
}
Prime(n);
float ans = 0.f;
for (int j = 1; j < n; j++)
{
ans += minDist[j];
}
printf("%.2f
", ans);
return 0;
}
著作権声明:このブログのオリジナル記事.ブログは、同意なしに転載してはいけません.