問題描述
目前在乙個很大的平面房間裡有 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 現在無線網路愈來愈普及,人們對網路質量的要求也愈來愈高。我們假設要在一條筆直的公路上安置無線網路接入點,以方便兩旁的居民上網。設公路的乙個終點為起點,那麼居...