poj 世界島

2022-06-23 14:15:12 字數 1421 閱讀 8739

描述

迪拜是富人的天堂。迪拜**賺錢有高招。他們建造了很多人工海島**。這些海島被建成各大洲的形狀,所以統稱為“世界島”。買了這些島的富豪們都想互相交個朋友,所以他們希望將這些島用橋連線起來。比爾蓋茨也預定了一個島,但他是唯一一個不想讓自己的島和其他島相連的富豪,因為他更願意乘坐他那條參加了二戰諾曼底登陸的登陸艇在海上旅行。好在比爾蓋茨不在乎哪個島是留給他的,所以迪拜**還是能夠找到一個建橋的最省錢的辦法。最省錢的辦法就是要使得橋的總長度最短。總而言之,如果有n個島,那麼他們就應該造n-2座橋連線n-1個島,然後把剩下的那個孤島給比爾。比爾隨便拿到哪個島都不會有意見。

請注意: 

1) 一個島可以看做一個點。

2) 一座橋可以看做是連線兩個島的一條線段。

3) 橋和橋只能在島上相連。

輸入

第一行是一個整數,表示測試資料的組數。

每組資料裡,第一行是一個整數n,表示島的數目(0 < n < 50),接下來有n行,每行包含兩個整數x和y, ( -20 <= x, y <= 20 ) , 表示一個島的座標。

輸出

對每組測試資料,輸出一行,內容為最省錢建橋方案下所有橋的總長度。結果四捨五入,保留小數點後面2位。

樣例輸入

2

50 0

1 018 0

0 11 1

30 0

1 00 1

樣例輸出

3.00

1.00

解題思路:

並查集,最小生成樹。

# include# include# includeusing namespace std;

struct e

po[51];

struct e2

}ed[1300];

int tree[1300];

int find(int x)

int main()

double min=123123123;

for(k=0;k}

/* for(i=0;iprintf("%d %d %.2lf\n",ed[i].a,ed[i].b,ed[i].len);

*/for(i=0;i<1300;i++)

tree[i]=i;

//排序

sort(ed,ed+index);

double sum=0;

for(j=0;j}

if(summin=sum;

} printf("%.2lf\n",min);

} }

return 0;

}