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