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