題目:洛谷p4047
難度:普及/提高-
演算法標籤:生成樹,並查集,二分答案
分析
要使每個部落之間的距離最大,我們可以採用貪心的策略,開始時看作每個居住點就是乙個部落,每次將居住點距離最近的兩個部落合併為乙個部落,使各個部落之間的距離增大,合併至只剩k個部落,此時距離最近的兩個部落之間的距離即是靠的最近的兩個部落的最大距離。
顯然我們需要合併n-k次,我們可以利用最小生成樹,則樹上第n-k+1長的邊就是答案(注意不是圖上第n-k+1長的邊)。
思維難度不大,**也比較好寫
code:
#include
#include
#include
#include
#include
using
namespace std;
int n,k,tot,next,vis[
1010
],x[
1010
],y[
1010];
double e[
1010][
1010
],a[
1010
],dis[
1010
],min=
200000000
;double
distance
(int a,
int b)
void
prim()
memset
(vis,0,
sizeof
(vis));
dis[1]
=0;for
(int i=
1;i<=n;i++)}
vis[next]=1
; a[
++tot]
=min;
for(
int j=
1;j<=n;j++)}
min=
200000000;}
}int
main()
for(
int i=
1;i<=n;i++)}
prim()
;sort
(a+2
,a+n+1)
;printf
("%.2f\n"
,a[n-k+2]
);//想一想為什麼我這裡寫的是+2
return0;
}
JSOI2010 部落劃分 最小生成樹
kruskal 加一點點東西就好.n 很小,可以暴力搞出所有的邊.然後按照邊的大小排序.用乙個並查集維護關係.同時記錄聯通塊的數量,大於 k 的時候照樣維護關係.如果已經等於 k 直接找到第一條兩端點不在同一聯通塊的邊輸出就好.include define db double using names...
P4047 JSOI2010 部落劃分
聰聰研究發現,荒島野人總是過著群居的生活,但是,並不是整個荒島上的所有野人都屬於同乙個部落,野人們總是拉幫結派形成屬於自己的部落,不同的部落之間則經常發生爭鬥。只是,這一切都成為謎團了 聰聰根本就不知道部落究竟是如何分布的。不過好訊息是,聰聰得到了乙份荒島的地圖。地圖上標註了n個野人居住的地點 可以...
BZOJ 1821 JSOI2010 部落劃分
給出n個點的座標,將n個點劃分成k個部分,使得每個部分之間最小的距離最大.每兩個點之間建邊,然後從小到到排序.要讓最小距離最大,就把小的距離用在每個部分內部,所以從小的邊開始合併,直到合併為k個部分為止.1 include 2 using namespace std 34 const int max...