Luogu P1991 無線通訊網 最小生成樹

2022-05-10 05:37:01 字數 1731 閱讀 1057

每個邊防哨所都要配備無線電收發器;有一些哨所還可以增配衛星**。

任意兩個配備了一條衛星**線路的哨所(兩邊都ᤕ有衛星**)均可以通話,無論

他們相距多遠。而只通過無線電收發器通話的哨所之間的距離不能超過 d,這是受收發器

的功率限制。收發器的功率越高,通話距離 d 會更遠,但同時**也會更貴。

收發器需要統一購買和安裝,所以全部哨所只能選擇安裝一種型號的收發器。換句話

說,每一對哨所之間的通話距離都是同乙個 d。你的任務是確定收發器必須的最小通話距

離 d,使得每一對哨所之間至少有一條通話路徑(直接的或者間接的)。

輸入格式:

從 wireless.in 中輸入資料第 1 行,2 個整數 s 和 p,s 表示可安裝的衛星**的哨所

數,p 表示邊防哨所的數量。接下裡 p 行,每行兩個整數 x,y 描述乙個哨所的平面座標

(x, y),以 km 為單位。

輸出格式:

輸出 wireless.out 中

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

輸入樣例#1: 

2 4

0 100

0 300

0 600

150 750

輸出樣例#1: 

212.13
對於 20% 的資料:p = 2,s = 1

對於另外 20% 的資料:p = 4,s = 2

對於 100% 的資料保證:1 ≤ s ≤ 100,s < p ≤ 500,0 ≤ x,y ≤ 10000。

其實是最小生成樹裸題,我竟然沒做出來==!(還是我太蒟了)

題意已經比較明白了,跑最小生成樹就行了。我們其實可以貪心地用那些開了外掛程式的衛星**來代替最小生成樹的最長的幾條邊,那麼能代替幾條呢?我們知道,如果有n個點,那生成樹就有n-1條邊,由於有p個點,每兩個點連一下可以代替一條邊,那麼就可以p-1條邊。於是我們求的最小長度就是最小生成樹中的第n-p條邊。

然後由於題目中給的是座標,那麼我們可以先預處理連一下邊。

code

1 #include2 #include3 #include4

5using

namespace

std;67

int s,p,tot,cnt,fa[600],line[600];8

struct

nodepoint[600

];11

struct

vergiledge[260000

];15

16double math_dis(double a,double b,double c,double

d)17

2021

bool

cmp(vergil p,vergil q)

2225

26int getf(int

x)27

3132

intmain()

3345 sort(edge+1,edge+tot+1

,cmp);

46for(int i=1;i<=p;i++) fa[i]=i;

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

4855 printf("

%.2lf

",edge[line[cnt]].val);

56return0;

57 }

view code

P1991 無線通訊網 MST

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

題解 P1991 無線通訊網

題目 這一題對我有歷史性的意義,因為我深刻意識到 不要用namespace 不要用namespace 不要用namespace 寫此題解,以示他人。搞錯重點了吧喂!好,回歸正題 這道題的思路是這樣 首先,用kruskal演算法。建議先把 並查集模板與 最小生成樹模板 打了再繼續看 我們回顧一下kru...

洛谷 P1991 無線通訊網

這道題找到關鍵點那就是模板題了,好寫噠 因為有s個 兩個 就可以連通兩個塊,那是不是我們就可以看做一條無消耗的邊,提前連了起來。根據kruskal的思想,我們每次加入最小的邊,直到聯通,由於兩台 一條線,所以我們加入的點也就只需要p s條了,相當於貪心掉了最大需要的邊。o泡 時間到 include ...