題目大意:
在這一堆路由器中找出第乙個路由器到第二個路由器經過的最少中轉路由器數,最少次數問題。用廣搜bfs,一層層搜,哪層搜到就返回層數 - 1,每層走的時候計搜到的新增路由器數,當經過的新增路由器數小於等於k時才入列。
注意:
建立鄰接表時,計算結點兩兩之間的距離,小於等於r就建立這兩個結點的連線。
bfs,佇列裡的每個元素是乙個列表 [ node 結點,step步數(層數) ,k_count 遍歷到新增結點的個數 ]
鄰接表長度是n+m, n以及n之後的結點是新增結點,所以通過結點標號是否 >=n 就可以判斷是否為新增結點。
bfs的時候,如果搜到新增結點個數超過k就不入隊。
python**(100)
def
getdist
(x1, y1, x2, y2)
:return
(abs
(x1 - x2)**2
+abs
(y1 - y2)**2
)**0.5def
bfs():
queue =[[
0,0,
0]]# [當前點,步數,新增型別的結點個數]
vis =
[false]*
len(graph)
vis[0]
=true
while queue:
node, step, k_count = queue.pop(0)
# 搜到點2就返回層數減1
if node ==1:
return step -
1# 找鄰點,如果新增型別的結點 超過k就不入隊
for nd in graph[node]
:# 遇到新增型別的結點,計數加一,標號是n以及之後的就是新增結點
k_count_tem =
(k_count +1)
if nd >= n else k_count
ifnot vis[nd]
and k_count_tem <= k:
[nd, step +
1, k_count_tem]
) vis[nd]
=true
n, m, k, r =
map(
int,
input()
.split())
graph =[[
]for _ in
range
(n + m)
]nodes =
for i in
range
(n + m):[
int(e)
for e in
input()
.split()]
)# 整理點,兩點距離<=r的連線,構圖
for i in
range
(len
(nodes)-1
):for j in
range
(i +1,
len(nodes)):
x1, y1 = nodes[i]
x2, y2 = nodes[j]
if getdist(x1, y1, x2, y2)
<= r:
graph[i]
graph[j]
print
(bfs(
))
CCF 201403 4 無線網路
問題描述 目前在乙個很大的平面房間裡有 n 個無線路由器,每個無線路由器都固定在某個點上。任何兩個無線路由器只要距離不超過 r 就能互相建立網路連線。除此以外,另有 m 個可以擺放無線路由器的位置。你可以在這些位置中選擇至多 k 個增設新的路由器。你的目標是使得第 1 個路由器和第 2 個路由器之間...
CCF 201403 4 無線網路
時間限制 1.0s 記憶體限制 256.0mb 目前在乙個很大的平面房間裡有 n 個無線路由器,每個無線路由器都固定在某個點上。任何兩個無線路由器只要距離不超過 r 就能互相建立網路連線。除此以外,另有 m 個可以擺放無線路由器的位置。你可以在這些位置中選擇至多 k 個增設新的路由器。你的目標是使得...
CCF 201403 4(無線網路)
一 問題 1.問題描述 目前在乙個很大的平面房間裡有 n 個無線路由器,每個無線路由器都固定在某個點上。任何兩個無線路由器只要距離不超過 r 就能互相建立網路連線。除此以外,另有 m 個可以擺放無線路由器的位置。你可以在這些位置中選擇至多 k 個增設新的路由器。你的目標是使得第 1 個路由器和第 2...