首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

POJ 2031 Building a Space Station:三維球體最小生成樹 (Prim)

     編輯:關於C++

問題描述

給定 n ≤ 100 個球體(空間站單元),每球有中心 (x,y,z) 和半徑 r。球之間若接觸/重疊則已連通(距離 ≤ 0),否則需建走廊連接,成本為球面最短距離 max(0, dist - r1 - r2)。求連通所有球的最小走廊總長度。

建模為最小生成樹

  • 節點:球體。
  • 邊權:w(i,j) = max(0, distance(center_i, center_j) - r_i - r_j)。
  • 求 MST 總權重即為答案。

Prim 算法實現(鄰接矩陣)

struct Node { double x,y,z,r; } p[105];
double dist(Node a, Node b) {
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
}
double w[105][105], d[105];
bool vis[105];

void prim(int n) {
    for (int i=1;i<=n;i++) d[i]=w[1][i], vis[i]=false;
    vis[1]=true; d[1]=0;
    double ans=0;
    for (int iter=1; iter

關鍵點

  • 三維歐氏距離計算。
  • 重疊球體邊權為 0,自動納入 MST 不增加成本。
  • n≤100,Prim O(n^2) 完全足夠,無需堆優化。
  • 輸出保留三位小數 %.3f。

總結

POJ 2031 是「幾何距離 + MST」的標準模板題。關鍵在於正確建立邊權公式(球面距離 = 中心距 - 半徑和),並識別重疊情況下的零權邊。Prim 算法配合鄰接矩陣代碼最簡潔,適合小規模稠密圖。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved