CCF CSP 201403 4 無線網路

2021-07-28 09:38:56 字數 1737 閱讀 6714

問題描述

目前在乙個很大的平面房間裡有 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樣例輸出

最短路徑的問題的衍生。。。

先回憶下spfa,我們在一般的spfa中,可以只用乙個一維陣列儲存當前得到的最小距離, 講真也只需要乙個一維的~~回到我們的問題上,可以想到應該是要把n+m個放到一起來做spfa, 然而這裡有個限制是那m個點最多只能取k個。

解決的辦法是將乙個點v在**乙個屬性k,意思是找到點v的時候,經過幾個m中的點。具體實現就是,spfa在做入隊操作時,本來是判斷如果v不在佇列中才將其加入佇列,而現在是,只要沒有相同k值的v在佇列,就將這個(v,k)加入佇列~

#include 

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

class point;};

class dist;};

const

int inf = 0x3f3f3f3f;

const

int maxn = 205;

bool adj[maxn][maxn];

int ds[maxn][maxn];

bool vis[maxn][maxn];

int n, m, k, r;

void spfa()}}

}}

}int main()

ll a, b;

for (int i = 0; i < pts.size(); i++)

}spfa();

int ans = inf;

for (int i = 0; i <= k; i++)

ans = min(ans, ds[1][i]);

cout

<< ans - 1

<< endl;

return

0;}

CCF CSP題解 201403 4 無線網路

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

201403 4 無線網路

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

201403 4 無線網路

測試資料很弱,用廣搜就可以找到最短路。但是貪心演算法應該不能每次都找到最優解。如果可以在超過k個位置中選擇新增路由器實現更短的路徑,那麼貪心的選擇就是最先搜尋到的k個位置。換句話說貪心認為無論在 新增路由器,減少中轉的效果是一樣的。列舉一些簡單情況可以證明這是不合理的。include include...