PYTHON解无向图路径长度之广度优先算法BFS
题目要求:
考虑无向图中每条边的权重是6,每个节点的标签是由连续的从1到n的数字组成。
一个列表清单,里面包含了无向图的所有边的信息(如:[1,2]就是1和2两个节点之前有一条边),要根据给出的起始节点信息,描述出从起始节点到其它所有节点的距离(权重信息),这个信息由列表返回,并且要按节点标签的升序排列,不其中不包含起始节点,如果某个节点不可达,该节点的权重为-1(如:给出一共有3个节点,但是只有[1,2]一条边的信息,那么节点3不可达,返回该节点为-1)。
输入的内容:
1、q:为提问次数(就是这个程序要循环几次,无所谓的值)
2、n:节点的总数,int n
3、m:节点边的数量,int m
4、edges:无向图边的信息,int edges[m][2]表示边的起点和终点(这里可能是我理解错了,无向图应该是没有方向的,所以无所谓起点和终点。)
5、s:起始节点是哪个,int s
例如:n=5, m=3, edges=[[1,2], [1,3], [3,4]], s=1
所有节点都是从1开始计算权重,经过计算后,2到5的权重信息为[6, 6 , 12 ,-1]。
代码如下:
def bfs(n:int, m:int, edges:list[int], s:int)->list[int]:
#用于存储最后的结果
results={i:-1 for i in range(1,n+1)}
#让循环从“开始节点”开始
results[s]=0
for i in range(m):
for s in [tem[0] for tem in results.items() if tem[1]==(6*i)]:
# 把包含开始节点的边都加入到里面,也就是正式开始bfs遍历过程,从第一层开始逐个遍历
next_edges=[edge for edge in edges if s in edge]
edges = [edge for edge in edges if s not in edge]
for edge in next_edges:
#如果edge[0]和S连接,就代表edge[0]和S的距离是6,字典中它的值设置为6
if results[edge[1] if s == edge[0] else edge[0]] == -1:
results[edge[1] if s==edge[0] else edge[0]] = (6*(i+1) )
if edges==[]:
break
#返回不包含开始节点的所有路径长度
return [edge for edge in results.values() if edge != 0]
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
q = int(input().strip())
for q_itr in range(q):
first_multiple_input = input().rstrip().split()
n = int(first_multiple_input[0])
m = int(first_multiple_input[1])
edges = []
for _ in range(m):
edges.append(list(map(int, input().rstrip().split())))
s = int(input().strip())
result = bfs(n,m,edges,s)
print(result)
基础款测试数据:
2 -》q的值
4 2
1 2
1 3
1
3 1
2 3
2
应该得到的输出是:
6 6 -1
-1 6
该测试数数据第一行是q值,第二行是n,m值,最后一行是答案