洛谷 P1991 無線通訊網 題解

2022-05-01 04:06:07 字數 1762 閱讀 3041

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

任意兩個配備了一條衛星**線路的哨所(兩邊都ᤕ有衛星**)均可以通話,無論他們相距多遠。而只通過無線電收發器通話的哨所之間的距離不能超過 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 40 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。

最小生成樹 + 克魯斯卡爾

有無線電收發器和衛星**兩種工具

衛星**不需要考慮距離

無線電收發器有傳播距離的限制

求這個限制最小是多少

衛星**可以當做免費的

p個哨所需要p-1條邊連線起來

而s個衛星**可以免去s-1條邊

所以就只剩下了p-s條邊需要找

找最小的

所以最小生成樹就很顯然了

將兩兩之間的匹配方式用結構圖儲存一下

然後sort排序從最短的邊開始試

如果這條邊連線的兩個點沒有被接起來

那就連起來就好了

這樣知道用完p-s條邊

因為從小到大排的序

所以最後用的那一條邊的權值就是最大的

輸出就好了

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

int read()

while(c >= '0' && c <= '9')

return sum * fg;

}const int max = 503;

int x[max],y[max];

int father[max];

struct node

a[max * max];

bool cmp(const node aa,const node bb)

int find(int xz)

void hebing(int xz,int yz)

int main()

} sort(a + 1,a + jj + 1,cmp);

int tot = p - s;

int js = 0;

double m = 0;

for(register int i = 1;i <= jj;++ i)

if(js == tot)

break;

} printf("%.2lf\n",m);

return 0;

}

洛谷 P1991 無線通訊網

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

題解 P1991 無線通訊網

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

洛谷P1991 無線通訊網 MST

題目 本題難在對題意的理解,也就是難在衛星 的放置上。以樣例說明,最小生成樹mst如下圖所示 可以放置2部衛星 所以還要放置2部接髮器。將邊bc去掉,得到兩個連通塊ab與cd,不妨衛星 放在點a,點c,則連通塊ab內接髮器功率要求為100,連通塊cd內接髮器功率為212.13,求出最大功率為212....