版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/AivenZhong/article/details/84658296
题目大意:
在这一堆路由器中找出第一个路由器到第二个路由器经过的最少中转路由器数,最少次数问题。用广搜bfs,一层层搜,哪层搜到就返回层数 - 1,每层走的时候计搜到的新增路由器数,当经过的新增路由器数小于等于k时才入列。
注意:
- 建立邻接表时,计算结点两两之间的距离,小于等于r就建立这两个结点的连接。
- bfs的逻辑是一层层的进行,每层的里面的元素是一个列表 [ node 结点,count 遍历到新增结点的个数 ]
- 邻接表长度是n+m, n之后的结点是新增结点,所以通过结点标号是否 》=n 就可以判断是否为新增结点。
- 这里我把原来的n个结点和新增的m个结点一起搜。搜到新增结点就计数加1,再入列。
python代码(100)
def getDist(n1, n2):
return (abs(n1[0] - n2[0]) ** 2 + abs(n1[1] - n2[1]) ** 2) ** 0.5
# 广搜,放回经过的结点总数
def bfs(start, end, graph, k, m):
n = len(graph)
queue = []
queue.append([start, 0]) # 列表第二个元素用来计新增的结点数
visited = [False for _ in graph]
layer = 0
# 每次遍历一层,生成下一层,迭代更新列表
while True:
temque = [] # 下一层
for popnode in queue: # 遍历这一层
if popnode[0] == end: # 如果走到end就返回层数
return layer - 1
# 生成下一层
for node in graph[popnode[0]]:
# 新增结点数没超过k的才入列
if not visited[node] and popnode[1] <= k:
count = popnode[1]
if node >= n - m:
count += 1
temque.append([node, count])
visited[node] = True
queue = temque
layer += 1
n, m, k, r = map(int, input().split())
nodes = []
graph = [[] for _ in range(n + m)]
# 存结点
for i in range(n + m):
nodes.append([int(v) for v in input().split()])
# 处理结点,算结点间的距离,距离在r之间就有连接
for i in range(len(nodes) - 1):
for j in range(i + 1, len(nodes)):
if getDist(nodes[i], nodes[j]) <= r:
graph[i].append(j)
graph[j].append(i)
# 从第一个结点(0)开始广搜,搜到第二个结点(1)就停,期间计数经过多少个结点。
print(bfs(0, 1, graph, k, m))
# 5 3 1 3
# 0 0
# 5 5
# 0 3
# 0 5
# 3 5
# 3 3
# 4 4
# 3 0