CCF 201403 4(無線網路)

2021-10-03 10:51:20 字數 3410 閱讀 9418

一:問題

1.問題描述

目前在乙個很大的平面房間裡有 n 個無線路由器,每個無線路由器都固定在某個點上。任何兩個無線路由器只要距離不超過 r 就能互相建立網路連線。

除此以外,另有 m 個可以擺放無線路由器的位置。你可以在這些位置中選擇至多 k 個增設新的路由器。

你的目標是使得第 1 個路由器和第 2 個路由器之間的網路連線經過盡量少的中轉路由器。請問在最優方案下中轉路由器的最少個數是多少?

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 個路由器最少經過的中轉路由器的個數。

3.樣例

樣例輸入

5 3 1 3

0 05 5

0 30 5

3 53 3

4 43 0

樣例輸出

2

二:理解

例子說明:

題目所說的第乙個點與第二個點,就是起點與終點。

在這個例子中的起點與終點就是:

005

5

將所有的點畫在座標軸上,從(0,0)出發,(5,5)結束,怎麼讓中間路由器最少。

這個答案為2,兩個路由器分別是:(0,3)和(3,3)這兩個點處的路由器。

解法:

1.資料結構:

struct point point[

205]

;struct status temp, end;

bool sign[

205]

;//標記訪問過的座標

queuep;

結構體point:儲存n+m個路由器位置的座標。

結構體status:記錄每個路由器的座標,這個路由器是第幾步,以及新增的路由器的個數。

陣列sign:用來記錄這個點的路由器是否被遍歷過。

2.初始化起始點

這個比較好理解,不用多講。

//初始化起始點 

temp.x = point[0]

.x;temp.y = point[0]

.y;temp.step =-1

;//只算中間的步數,不計算開始與結束的路由器

temp.counts =0;

p.push

(temp)

;sign[0]

=true

;

3.dfs(深搜)

while

(!p.

empty()

)// 搜尋可以連線的路由器

if(temp.counts == k)

maxnum = n;

else

maxnum = n + m;

//從front點開始挨個遍歷

for(

int i=

0; i}

將佇列中的第乙個數用乙個臨時的資料結構,status temp; 來儲存,然後將這第乙個數出隊。

①.結束,出口標誌

若是結束了,將這個點(也就是終點了)到起始點的步數,輸出就可以了。

//結束,到終點 

if(temp.x==point[1]

.x && temp.y==point[1]

.y)

②.判斷加入的路由器的個數是否會超過規定的個數

如果還不到終點,而且新加入的路由器的個數已經等於要求的數了,那麼他到終點也是不滿足要求的,所以就在所有的存在的路由器遍歷一遍即可。

// 搜尋可以連線的路由器

if(temp.counts == k)

maxnum = n;

else

maxnum = n + m;

③.不滿足條件的情況

if

(sign[i]

)//便利過了就可以跳過

continue;if

((temp.x - point[i]

.x)*

(temp.x - point[i]

.x)+

(temp.y - point[i]

.y)*

(temp.y - point[i]

.y)>r*r)

continue

;//超過距離就跳過

④.更新每個點的座標以及步數,若為新增的路由器,就更新新增總數,並且將每個可以的數都進隊。

sign[i]

=true

;end.x = point[i]

.x;end.y = point[i]

.y;end.step = temp.step +1;

//更新新增路由器的數量

if(i >= n)

//新增的位置,那麼就要計算增加的數

end.counts = temp.counts+1;

else

end.counts = temp.counts;

三:**

#include

#include

#include

using

namespace std;

struct point point[

205]

;struct status temp, end;

bool sign[

205]

;//標記訪問過的座標

intmain()

// 搜尋可以連線的路由器

if(temp.counts == k)

maxnum = n;

else

maxnum = n + m;

//從front點開始挨個遍歷

for(

int i=

0; i}}

CCF 201403 4 無線網路

問題描述 目前在乙個很大的平面房間裡有 n 個無線路由器,每個無線路由器都固定在某個點上。任何兩個無線路由器只要距離不超過 r 就能互相建立網路連線。除此以外,另有 m 個可以擺放無線路由器的位置。你可以在這些位置中選擇至多 k 個增設新的路由器。你的目標是使得第 1 個路由器和第 2 個路由器之間...

CCF 201403 4 無線網路

題目大意 在這一堆路由器中找出第乙個路由器到第二個路由器經過的最少中轉路由器數,最少次數問題。用廣搜bfs,一層層搜,哪層搜到就返回層數 1,每層走的時候計搜到的新增路由器數,當經過的新增路由器數小於等於k時才入列。注意 建立鄰接表時,計算結點兩兩之間的距離,小於等於r就建立這兩個結點的連線。bfs...

CCF 201403 4 無線網路

時間限制 1.0s 記憶體限制 256.0mb 目前在乙個很大的平面房間裡有 n 個無線路由器,每個無線路由器都固定在某個點上。任何兩個無線路由器只要距離不超過 r 就能互相建立網路連線。除此以外,另有 m 個可以擺放無線路由器的位置。你可以在這些位置中選擇至多 k 個增設新的路由器。你的目標是使得...