問題描述
目前在乙個很大的平面房間裡有 n 個無線路由器,每個無線路由器都固定在某個點上。任何兩個無線路由器只要距離不超過 r 就能互相建立網路連線。
除此以外,另有 m 個可以擺放無線路由器的位置。你可以在這些位置中選擇至多 k 個增設新的路由器。
你的目標是使得第 1 個路由器和第 2 個路由器之間的網路連線經過盡量少的中轉路由器。請問在最優方案下中轉路由器的最少個數是多少?
輸入格式
第一行包含四個正整數 n,m,k,r。(2 ≤ n ≤ 100,1 ≤ k ≤ m ≤ 100, 1 ≤ r ≤ 108)。
接下來 n 行,每行包含兩個整數 xi 和 yi,表示乙個已經放置好的無線 路由器在 (xi, yi) 點處。輸入資料保證第 1 和第 2 個路由器在僅有這 n 個路由器的情況下已經可以互相連線(經過一系列的中轉路由器)。
接下來 m 行,每行包含兩個整數 xi 和 yi,表示 (xi, yi) 點處可以增設 乙個路由器。
輸入中所有的座標的絕對值不超過 108,保證輸入中的座標各不相同。
輸出格式
輸出只有乙個數,即在指定的位置中增設 k 個路由器後,從第 1 個路 由器到第 2 個路由器最少經過的中轉路由器的個數。
樣例輸入
5 3 1 3
0 0
5 5
0 3
0 5
3 5
3 3
4 4
3 0
樣例輸出
2注釋:
網上很多這道題的題解,都是用spfa演算法來做的,不知道為什麼,感覺用spfa演算法很不好理解,為什麼曾經入過佇列的還可以再次進入佇列。
優先搜尋已經放置好的路由器也很好實現,因為它優先輸入,所以用結構體優先儲存就好了,搜尋的時候按下標從小到大搜。
滿分過..
hljs cpp">#include
using
namespace
std;
int n, m, k, r;
intmap[201][201]=;
struct node;
node node[201];
queue
q;int main()
for(int i=1; i<=n+m; i++)
for(int i=1; ifor(int j=i+1; j<=n+m; j++)}}
node[1].inq=1;
node[1].num=0;
node[1].step=0;
q.push(node[1]);
while(!q.empty())
if(i>n)
}else}}
}return
0;}
CCF 無線網路
試題名稱 無線網路 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 目前在乙個很大的平面房間裡有 n 個無線路由器,每個無線路由器都固定在某個點上。任何兩個無線路由器只要距離不超過 r 就能互相建立網路連線。除此以外,另有 m 個可以擺放無線路由器的位置。你可以在這些位置中選擇至...
CCF 無線網路
問題描述 目前在乙個很大的平面房間裡有 n 個無線路由器,每個無線路由器都固定在某個點上。任何兩個無線路由器只要距離不超過 r 就能互相建立網路連線。除此以外,另有 m 個可以擺放無線路由器的位置。你可以在這些位置中選擇至多 k 個增設新的路由器。你的目標是使得第 1 個路由器和第 2 個路由器之間...
ccf 無線網路 BFS spfa
201403 4 試題名稱 無線網路 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 目前在乙個很大的平面房間裡有 n 個無線路由器,每個無線路由器都固定在某個點上。任何兩個無線路由器只要距離不超過 r 就能互相建立網路連線。除此以外,另有 m 個可以擺放無線路由器的位置。你可以...