这个问题正在寻求最小生成树。
给定节点的坐标,那么我们需要根据各个点之间的这些坐标来计算距离。
除了这是标准的Prime算法的,能源利用Prime基本上,你可以使用Kruskal。
经典的算法必须填写,熟练度。否则它是非常困难的利用。
并且经典的算法之所以为经典。原因之中的一个是没那么easy自己凭空想象出来的,所以要熟练。
#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\n", ans); return 0; }
版权声明:本文博客原创文章。博客,未经同意,不得转载。
时间: 2024-10-24 20:53:33