BZOJ 1821 JSOI2010 部落劃分

2022-08-12 06:03:14 字數 1440 閱讀 2338

給出n個點的座標,將n個點劃分成k個部分,使得每個部分之間最小的距離最大.

每兩個點之間建邊,然後從小到到排序.要讓最小距離最大,就把小的距離用在每個部分內部,所以從小的邊開始合併,直到合併為k個部分為止.

1 #include 2

using

namespace

std;34

const

int maxn=1000+5;5

intn,k;

6int

f[maxn];

7struct nodea[maxn];

8struct

edge

11 edge(int x,int y,int

w):x(x),y(y),w(w){}

12bool

operator

< (const edge &a)const

13 }e[maxn*maxn];

14 inline int find(int x)

15 inline int dis(node a,node b)

16int

main()31}

32}33return0;

34 }

view code

time limit: 10 sec  memory limit: 64 mb

submit: 1791  solved: 862

[submit][status][discuss]

聰聰研究發現,荒島野人總是過著群居的生活,但是,並不是整個荒島上的所有野人都屬於同乙個部落,野人們總是拉幫結派形成屬於自己的部落,不同的部落之間則

經常發生爭鬥。只是,這一切都成為謎團了——聰聰根本就不知道部落究竟是如何分布的。

不過好訊息是,聰聰得到了乙份荒島的地圖。地圖上標註了n個野人居住的地點(可以看作是平面上的座標)。我們知道,同乙個部落的野人總是生活在附近。我們

把兩個部落的距離,定義為部落中距離最近的那兩個居住點的距離。聰聰還獲得了乙個有意義的資訊——這些野人總共被分為了k個部落!這真是個好訊息。聰聰希

望從這些資訊裡挖掘出所有部落的詳細資訊。他正在嘗試這樣一種演算法:

對於任意一種部落劃分的方法,都能夠求出兩個部落之間的距離,聰聰希望求出一種部落劃分的方法,使靠得最近的兩個部落盡可能遠離。

例如,下面的左圖表示了乙個好的劃分,而右圖則不是。請你程式設計幫助聰聰解決這個難題。

第一行包含兩個整數n和k(1< = n < = 1000,1< k < = n),分別代表了野人居住點的數量和部落的數量。

接下來n行,每行包含兩個正整數x,y,描述了乙個居住點的座標(0 < =x, y < =10000)

輸出一行,為最優劃分時,最近的兩個部落的距離,精確到小數點後兩位。

4 20 0

0 11 1

1 0

1.00

jsoi2010第二輪contest1

bzoj1821 部落劃分

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

BZOJ1821部落劃分

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

bzoj1821(克魯斯卡爾)

hzwer上的,知道是用克魯斯卡爾,但是思路還是自己猜出來的 思路 感覺就是猜出來的,因為所有的點集之間的距離是他們所含點對之間的最短距離,對於例題中的圖,想像一下,在這幾個點集之間相互連邊 就是連最短的邊,他們就會聯通,實際上本題就是,把所有的點按最小距離連起來,找到最大的k 1條邊,把他們刪掉 ...