最小生成樹

2021-10-05 04:54:30 字數 1779 閱讀 8403

2023年,全中國實現了戶戶通電。作為一名電力建設者,小明正在幫助一帶一路上的國家通電。

這一次,小明要幫助 n 個村莊通電,其中 1 號村莊正好可以建立乙個發電站,所發的電足夠所有村莊使用。

現在,這 n 個村莊之間都沒有電線相連,小明主要要做的是架設電線連線這些村莊,使得所有村莊都直接或間接的與發電站相通。

小明測量了所有村莊的位置(座標)和高度,如果要連線兩個村莊,小明需要花費兩個村莊之間的座標距離加上高度差的平方,形式化描述為座標為 (x_1, y_1) 高度為 h_1 的村莊與座標為 (x_2, y_2) 高度為 h_2 的村莊之間連線的費用為

sqrt((x_1-x_2)(x_1-x_2)+(y_1-y_2)(y_1-y_2))+(h_1-h_2)*(h_1-h_2)。

在上式中 sqrt 表示取括號內的平方根。請注意括號的位置,高度的計算方式與橫縱座標的計算方式不同。

由於經費有限,請幫助小明計算他至少要花費多少費用才能使這 n 個村莊都通電。

輸入格式

輸入的第一行包含乙個整數 n ,表示村莊的數量。

接下來 n 行,每個三個整數 x, y, h,分別表示乙個村莊的橫、縱座標和高度,其中第乙個村莊可以建立發電站。

輸出格式

輸出一行,包含乙個實數,四捨五入保留 2 位小數,表示答案。

樣例輸入

41 1 3

9 9 7

8 8 6

4 5 4

樣例輸出

17.41

評測用例規模與約定

對於 30% 的評測用例,1 <= n <= 10;

對於 60% 的評測用例,1 <= n <= 100;

對於所有評測用例,1 <= n <= 1000,0 <= x, y, h <= 10000。

題解通過閱讀題面了解到是最小生成樹的模板題。接收完資料後,需要通過題目給出的公式算出兩點之間的權重,結果儲存到乙個鄰接矩陣裡(稠密圖)。最後使用普里姆演算法,設定第乙個結點為起點,求出最小生成樹。最後將所有邊的權值加起來就是答案。輸出可以使用printf("%.2f")格式化輸出,最自動四捨五入。

**:`#include

#include

#include

#include

#define n 1001

#define white 0

#define gray 1

#define black 2

#define infty 1 << 21

using namespace std;

double m[n][n], d[n];

int color[n], p[n], n;

struct node arr[n];

void prim ()

d[0] = 0;

p[0] = -1;

int mincost, u;

while (1)

}if (mincost == infty)

break;

color[u] = black;

for (int v = 0; v < n; v++)

}}}int main ()

for (int i = 0; i < n; i++) }}

prim();

double ans = 0;

for (int i = 0; i < n; i++)

ans += d[i];

printf("%.2f", ans);

return 0;

}`知識點

圖論;最小生成樹;

普里姆演算法。

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...

最小生成樹

define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...