每個邊防哨所都要配備無線電收發器;有一些哨所還可以增配衛星**。
任意兩個配備了一條衛星**線路的哨所(兩邊都ᤕ有衛星**)均可以通話,無論他們相距多遠。而只通過無線電收發器通話的哨所之間的距離不能超過 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輸出 #1複製0 100
0 300
0 600
150 750
212.13對於 20% 的資料:p = 2,s = 1
對於另外 20% 的資料:p = 4,s = 2
對於 100% 的資料保證:1 ≤ s ≤ 100,s < p ≤ 500,0 ≤ x,y ≤ 10000。
思路
建圖算出點之間距離跑kruskal,滿足可以通訊的站點數 就是總數 - 衛星通話的站點數
code
1 #include 2 #include 3 #include 4 #include 5 #include 6view code7using
namespace
std;
8const
int maxn = 2e5+7;9
10///
把所有邊排序,記第i小的邊為:e[i](1
<= i < m)
11///
初始化mst為空
12///
初始化連通分量,讓每個點自成乙個獨立的連通分量
13///
for(int i = 0; i
< m; i++)
18///}19
20int fa[5050
],n,m,ans,eu,ev,cnt;
2122
struct
nodee[maxn];
2627
struct
node a[maxn];
3031
bool
cmp(node a, node b)
3235
36int fid(int
x)37
4041
void init(int
n)42
46 ans = 0
;47 cnt = 0;48
}4950bool unite(int r1, int r2)///
冰茶雞51
57return
false;58
}5960void kruskal(int n,int s,int
m)61
69 ans +=e[i].w;
70 fa[ev] =eu;
71//
printf("cnt:%d n-s:%d\n",cnt+1,n-s);
72if(++cnt == n-s) 76}
77}7879
intmain()
8089
int num = 1;90
for(int i = 1; i <= n; i++) 96}
97/*
for(int i = 1; i <= num; i++)
*/100 num--;
101init(n);
102kruskal(n,s,num);
103}
104return0;
105 }
洛谷P1991 無線通訊網 MST
題目 本題難在對題意的理解,也就是難在衛星 的放置上。以樣例說明,最小生成樹mst如下圖所示 可以放置2部衛星 所以還要放置2部接髮器。將邊bc去掉,得到兩個連通塊ab與cd,不妨衛星 放在點a,點c,則連通塊ab內接髮器功率要求為100,連通塊cd內接髮器功率為212.13,求出最大功率為212....
題解 P1991 無線通訊網
題目 這一題對我有歷史性的意義,因為我深刻意識到 不要用namespace 不要用namespace 不要用namespace 寫此題解,以示他人。搞錯重點了吧喂!好,回歸正題 這道題的思路是這樣 首先,用kruskal演算法。建議先把 並查集模板與 最小生成樹模板 打了再繼續看 我們回顧一下kru...
洛谷 P1991 無線通訊網
這道題找到關鍵點那就是模板題了,好寫噠 因為有s個 兩個 就可以連通兩個塊,那是不是我們就可以看做一條無消耗的邊,提前連了起來。根據kruskal的思想,我們每次加入最小的邊,直到聯通,由於兩台 一條線,所以我們加入的點也就只需要p s條了,相當於貪心掉了最大需要的邊。o泡 時間到 include ...