問題描述
目前在乙個很大的平面房間裡有 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 05 5
0 30 5
3 53 3
4 43 0
樣例輸出
這道題是最優問題(無權最短路徑),考慮用bfs求解,然後發現是一道典型的bfs。bfs流程在**中有詳細注釋。
#include#include#includeusing namespace std;
const int max_routers = 200;
struct coordrouters[max_routers];
struct router_info;
bool visited[max_routers] = ;
int bfs(int n,int m,int k,long long r,int begin,int end){
queueq;
router_info start,front,t;
int limit;
start.x = routers[begin].x;
start.y = routers[begin].y;
start.step = start.optional_num = 0;
q.push(start);
visited[begin] = true;
while(!q.empty()){
front = q.front();
q.pop();
if(front.x==routers[end].x && front.y==routers[end].y)//找到最優解
return front.step - 1;
//尋找相鄰結點(孩子),分兩種情況
if(front.optional_num==k)//路徑已使用了k個可選路由器,之後不用再在可選路由器中搜尋
limit = n;
else//仍需在可選路由器中搜尋
limit = m + n;
for(int i=0;i這裡r達到了10^8數量級,計算距離涉及到平方,所以要用long long型別,同時座標也要定義為long long型別
在使用scanf方式輸入座標的時候別忘了要使用%lld而不是%d,否則得90分
這題稍微有點擴充套件的就是多了可選路由器的處理,去掉這部分應該是最簡bfs
CCF 201403 4 無線網路
題目大意 在這一堆路由器中找出第乙個路由器到第二個路由器經過的最少中轉路由器數,最少次數問題。用廣搜bfs,一層層搜,哪層搜到就返回層數 1,每層走的時候計搜到的新增路由器數,當經過的新增路由器數小於等於k時才入列。注意 建立鄰接表時,計算結點兩兩之間的距離,小於等於r就建立這兩個結點的連線。bfs...
CCF 201403 4 無線網路
時間限制 1.0s 記憶體限制 256.0mb 目前在乙個很大的平面房間裡有 n 個無線路由器,每個無線路由器都固定在某個點上。任何兩個無線路由器只要距離不超過 r 就能互相建立網路連線。除此以外,另有 m 個可以擺放無線路由器的位置。你可以在這些位置中選擇至多 k 個增設新的路由器。你的目標是使得...
CCF 201403 4(無線網路)
一 問題 1.問題描述 目前在乙個很大的平面房間裡有 n 個無線路由器,每個無線路由器都固定在某個點上。任何兩個無線路由器只要距離不超過 r 就能互相建立網路連線。除此以外,另有 m 個可以擺放無線路由器的位置。你可以在這些位置中選擇至多 k 個增設新的路由器。你的目標是使得第 1 個路由器和第 2...