CCF CSP 無線網路 BFS

2021-07-28 08:23:05 字數 1805 閱讀 2463

問題描述

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

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

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

輸入格式

第一行包含四個正整數 n,m,k,r。(2 ≤ n ≤ 100,1 ≤ k ≤ m ≤ 100,)。

接下來 n 行,每行包含兩個整數 x

i 和 y

i,表示乙個已經放置好的無線 路由器在 (x

i, y

i) 點處。輸入資料保證第 1 和第 2 個路由器在僅有這 n 個路由器的情況下已經可以互相連線(經過一系列的中轉路由器)。

接下來 m 行,每行包含兩個整數 x

i 和 y

i,表示 (x

i, y

i) 點處可以增設 乙個路由器。

輸入中所有的座標的絕對值不超過 10

8,保證輸入中的座標各不相同。

輸出格式

輸出只有乙個數,即在指定的位置中增設 k 個路由器後,從第 1 個路 由器到第 2 個路由器最少經過的中轉路由器的個數。

樣例輸入

5 3 1 3

0 05 5

0 30 5

3 53 3

4 43 0

樣例輸出

2———————————————————————————————————————

要求找「最短」,每次都是從乙個狀態轉移到另乙個狀態,可以使用廣搜解決。需要確認bfs時各節點表示的狀態是用哪幾個引數表示。題目輸入的座標訪問可以很大,所以需要離散化儲存座標,在vector中連續的儲存輸入的座標,這樣可以用陣列的下標id去確定任意乙個路由器。那麼廣搜樹上每個節點所表示的狀態就是由三個引數組成:id表示路由器的座標,step表示到該狀態時中轉了多少個路由器,k_num表示到該狀態時已經新設了多少個路由器。

只需要注意資料規模,1 ≤ r,x,y≤ 10

8,如果是int型別的數,因為int是32位的,所以最大可以表示到2

32,也就是4,294,967,296。對於表示10

8並沒有問題,但是我的程式裡需要比較兩個路由器之間的距離需要對r、x、y做平方,那麼就得用到最大可表示的long long型別儲存了。我開始就是這裡給扣了20分。

還有乙個需要吐槽的,這題的測試資料,似乎對k沒有做任何要求,我看有的程式不對k做設定都行。。。

**如下:

#include#include#include#includeusing namespace std;

#define ll long long

#define inf 1<<31

int n,m,k;

ll r;

struct noden;

struct infot;

queueq;

vectorvec;

bool get[220];

bool judge(ll x1,ll y1,ll x2,ll y2)

get[i]=true;

t.step=new_t.step+1;

if(i>=n)//說明是新設的路由器

else

t.id=i;

q.push(t);}}

} return num;

}int main()

cout << bfs();

return 0;

}

CCF CSP 201403 4 無線網路

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

CCF CSP題解 201403 4 無線網路

新建不超過 k 個無線路由器,求使路由器1 2連通最少的中間路由器。首先常規建圖,將相距不超過 r 的路由器 包括新建的 相連。想到了分層 dijkstra 類似的,作 bfs 時記錄已經經過的新建路由器個數 b queue 內節點的形式就是當前路由器編號 經過的新建路由器個數 經過的路由器個數 v...

A 無線網路

accept 29 submit 107 time limit 1000ms memory limit 65536kb description 現在無線網路愈來愈普及,人們對網路質量的要求也愈來愈高。我們假設要在一條筆直的公路上安置無線網路接入點,以方便兩旁的居民上網。設公路的乙個終點為起點,那麼居...