無線通訊網 紀中3078 最小生成樹

2021-07-16 19:47:52 字數 2909 閱讀 8640

任意兩個配備了一條衛星**線路的哨所均可以通話,無論它們相距多遠。而只通過無線電收發器通話的哨所之間的距離不能超過d,這是受收發器的功率限制。收發器的功率越高,通話距離d會更遠,但同時**也更貴。

收發器需要統一購買和安裝,所以全部哨所只能選擇安裝一種型號的收發器。換句話說,每一對哨所之間的通話距離都是同乙個d。

你的任務是確定收發器必須的最小通話距離d,使得每一對哨所之間至少有一條通話路徑(直接的或者間接的)。

第1行:2個整數s(1 <= s <= 100)和p(s < p <= 500),s表示可安裝的衛星**的線路數,p表示邊防哨所的數量。

接下來p行,每行描述乙個哨所的平面座標(x,y),以km為單位,整數,0<=x,y<=10,000

第1行:1個實數d,表示無線電收發器的最小傳輸距離。精確到小數點後2位。

因為是圖論專題,所以想一想則會發現,圖的生成樹具有把圖連通的功能,

而最小生成樹的最大邊是所有生成樹中最大邊最小的。

這個性質還可以加強為:若把生成樹的n-1條邊按權值排序,則最小生成樹的每條邊都不大於另一棵生成樹。

這樣,就可以先用kruskal演算法求出一棵最小生成樹的n-1條邊(加並查集優化)。

然後找到第n-1-s條邊的長度,即是題目所求的d值。

const

maxn=1000;

maxe=500000;

type

arr=record

x,y:longint;

w:real;

end;

var dis:array[1..maxe] of arr;

edge:array[1..maxe] of arr;

x,y:array[1..maxn] of longint;

father:array[1..maxn] of longint;

n,m,nm:longint;

ans:real;

procedure

add(x,y:longint;w:real);

begin

m:=m+1;

edge[m].x:=x;

edge[m].y:=y;

edge[m].w:=w;

end;

procedure

init;

var i,j,k:longint;

distance:real;

begin

readln(nm,n);

for i:=1

to n do

readln(x[i],y[i]);

for i:=1

to n do

begin

for j:=i+1

to n do

begin

distance:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));

add(i,j,distance);

end;

end;

end;

procedure

qsort

(l,r:longint);

var i,j,k:longint;

temp:arr;

mid:real;

begin

if l>=r then

exit;

i:=l; j:=r;

mid:=edge[(l+r) div

2].w;

repeat

while edge[i].wdo i:=i+1;

while edge[j].w>mid do j:=j-1;

if i<=j then

begin

temp:=edge[i]; edge[i]:=edge[j]; edge[j]:=temp;

i:=i+1; j:=j-1;

end;

until i>j;

qsort(l,j);

qsort(i,r);

end;

function

find

(x:longint):longint;

begin

if father[x]=x then

exit(x);

father[x]:=find(father[x]);

find:=father[x];

end;

procedure

union

(x,y:longint);

var i,j:longint;

begin

i:=find(x); j:=find(y);

father[i]:=j;

end;

procedure

main;

var i,j,k:longint;

begin

init;

qsort(1,m);

for i:=1

to n do

father[i]:=i;

j:=0;

i:=1;

while j1

dobegin

with edge[i] do

begin

if find(x)<>find(y)

then

begin

j:=j+1;

dis[j]:=edge[i];

union(x,y);

end;

end;

i:=i+1;

end;

nm:=nm-1;

if nm>=n

then

write(0.00:0:2)

else

write(dis[j-nm].w:0:2);

end;

begin

main;

end.

無線通訊網 紀中3078 最小生成樹

任意兩個配備了一條衛星 線路的哨所均可以通話,無論它們相距多遠。而只通過無線電收發器通話的哨所之間的距離不能超過d,這是受收發器的功率限制。收發器的功率越高,通話距離d會更遠,但同時 也更貴。收發器需要統一購買和安裝,所以全部哨所只能選擇安裝一種型號的收發器。換句話說,每一對哨所之間的通話距離都是同...

P1991 無線通訊網 最小生成樹

每個邊防哨所都要配備無線電收發器 有一些哨所還可以增配衛星 任意兩個配備了一條衛星 線路的哨所 兩邊都 有衛星 均可以通話,無論他們相距多遠。而只通過無線電收發器通話的哨所之間的距離不能超過 d,這是受收發器的功率限制。收發器的功率越高,通話距離 d 會更遠,但同時 也會更貴。收發器需要統一購買和安...

P1991 無線通訊網 最小生成樹

每個邊防哨所都要配備無線電收發器 有一些哨所還可以增配衛星 任意兩個配備了一條衛星 線路的哨所 兩邊都 有衛星 均可以通話,無論他們相距多遠。而只通過無線電收發器通話的哨所之間的距離不能超過 d,這是受收發器的功率限制。收發器的功率越高,通話距離 d 會更遠,但同時 也會更貴。收發器需要統一購買和安...