P1991 無線通訊網 最小生成樹

2022-04-30 21:30:17 字數 1711 閱讀 2028

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

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

收發器需要統一購買和安裝,所以全部哨所只能選擇安裝一種型號的收發器。換句話說,每一對哨所之間的通話距離都是同乙個 d。你的任務是確定收發器必須的最小通話距離 d,使得每一對哨所之間至少有一條通話路徑(直接的或者間接的)。

點讚最多的那篇題解提到了瓶頸生成樹,個人覺得造成了一些不必要的引入和證明(當然有興趣者可以進行學習),實際上就用聯通塊也可以解釋得很清楚,個人感覺也沒有什麼問題。

那就來口胡一下

首先回顧kruskal演算法求解最小生成樹步驟:其運用貪心思想,每次加入最小邊,直到所有點連通為止。

首先根據題意,這個圖是乙個完全圖,我們要找乙個存在限制條件的生成樹。

那麼對於本題,我們首先考慮沒有衛星**存在的情況,顯然就是乙個裸的最小生成樹。我們來看加邊過程的具體意義:每次加入一條沒有使用過的最短邊,且該邊沒有連線兩個已經連通的哨所,那麼這條邊會將至少兩個哨所相連。

接著我們來看乙個這樣的例子:

假設此時p=5,s=3。

假設當前1、2、3為用無線電連線的哨所,4、5是用衛星**連線的哨所。此時我們只要在1、2、3中某乙個加乙個衛星**,就可以使它們全部連通。

因此我們不妨考慮先放無線電,加最短邊加到聯通塊數量減為s為止(不考慮衛星**哨所之間的連邊,如上圖紫邊),此時還剩下s-1個點,如果我們在這些點放置無線電,顯然會造成總體不優,所以我們在這些點中放衛星**。

那麼還剩乙個衛星**沒有放怎麼辦?我們在之前放下去的無線電中找出來乙個點放,並且還要使得答案不變壞,那這樣一來所有點也就連通了。

#include#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f

#define pi acos(-1.0)

#define n 250010

#define mod 2520

#define e 1e-12

#define in freopen("data.in","r",stdin);

using namespace std;

inline int read()

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

return x*f;

}struct node

}g[n];

struct data[n];

inline double fun(int x1,int y1,int x2,int y2)

int s,p,fa[n];

inline int get(int x)

inline void merge(int x,int y)

int main()

sort(g+1,g+cnt+1);

double ans=0;

int tot=p;

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

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

return 0;

}

P1991 無線通訊網 最小生成樹

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

P1991 無線通訊網 MST

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

題解 P1991 無線通訊網

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