ZJOI2010 部落劃分

2022-09-09 05:24:14 字數 1087 閱讀 8460

\(【題目描述】\)

在二維平面的第一象限上有\(n(n\leq 10^3)\)個野人居住點,數個野人居住點可以組成乙個部落,兩個部落之間的距離為這兩個部落歐幾里德距離最近的兩個居住點的距離,已知現在有\(k(k\leq 10^3)\)個部落,問部落之間最近的距離最遠是多少(保留兩位小數)?

\(【輸入樣例】\)

4 2

0 00 1

1 11 0

\(【輸出樣例】\)

1.00
\(【考點】\)

最小生成樹、並查集

\(【做法】\)

將居住點看成點,求出它們兩兩之間的距離,將它們之間的距離看成邊,然後從小到大排序,用並查集維護,每次判斷一條邊的兩端的點是否已經組成乙個部落(即是否已經聯通),如果不聯通則將它們放入乙個部落,部落總數減少一,直到部落數等於\(k\)為止,輸出此時邊權最小且兩端居住點不在同乙個部落內的邊。

\(【**】\)

#include#include#include#include#includeusing namespace std;

const int n=1e3+50;

struct pointa[n*n];

int u[n],v[n];

int fa[n];

int n,k,tot;

int sq(int x)

int abs(int x)

double dist(int sx,int sy,int ex,int ey)//計算兩點距離

bool cmp(point a,point b)

int find(int x)

bool merge(int x,int y)//判斷兩個居住點是否在同乙個部落

int main()

}for(int i=1;i<=n;i++) fa[i]=i;

sort(a+1,a+1+tot,cmp);

int ans=n;

for(int i=1;i<=tot;i++)

}return 0;}}

return 0;

}

JSOI2010 部落劃分

題目 洛谷p4047 難度 普及 提高 演算法標籤 生成樹,並查集,二分答案 分析 要使每個部落之間的距離最大,我們可以採用貪心的策略,開始時看作每個居住點就是乙個部落,每次將居住點距離最近的兩個部落合併為乙個部落,使各個部落之間的距離增大,合併至只剩k個部落,此時距離最近的兩個部落之間的距離即是靠...

P4047 JSOI2010 部落劃分

聰聰研究發現,荒島野人總是過著群居的生活,但是,並不是整個荒島上的所有野人都屬於同乙個部落,野人們總是拉幫結派形成屬於自己的部落,不同的部落之間則經常發生爭鬥。只是,這一切都成為謎團了 聰聰根本就不知道部落究竟是如何分布的。不過好訊息是,聰聰得到了乙份荒島的地圖。地圖上標註了n個野人居住的地點 可以...

BZOJ 1821 JSOI2010 部落劃分

給出n個點的座標,將n個點劃分成k個部分,使得每個部分之間最小的距離最大.每兩個點之間建邊,然後從小到到排序.要讓最小距離最大,就把小的距離用在每個部分內部,所以從小的邊開始合併,直到合併為k個部分為止.1 include 2 using namespace std 34 const int max...