python 最长广播效应

题目描述
某通信网络中有N个网络结点,用1到N进行标识。
网络中的结点互联互通,且结点之间的消息传递有时延,相连结点的时延均为一个时间单位。
现给定网络结点的连接关系link[i]={u,v},其中u和v表示网络结点。
当指定一个结点向其他结点进行广播,所有被广播结点收到消息后都会在原路径上回复一条响应消息,请计算发送结点至少需要等待几个时间单位才能收到所有被广播结点的响应消息。
注:

N的取值范围为[1,100];
连接关系link的长度不超过3000,且1 <= u,v <= N;
网络中任意结点间均是可达的;
输入描述
输入的第一行为两个正整数,分别表示网络结点的个数N,以及时延列表的长度T;
接下来的T行输入,表示结点间的连接关系列表;
最后一行的输入为一个正整数,表示指定的广播结点序号;
输出描述
输出一个整数,表示发送结点接收到所有响应消息至少需要等待的时长。

示例
输入
5 7
1 4
2 1
2 3
2 4
3 4
3 5
4 5
2

输出
4
BFS 宽度优先搜索  Breadth-First-Search

a= """5 7
1 4
2 1
2 3
2 4
3 4
3 5
4 5
2"""
a = a.split('\n')
start_num = int(a[-1])
data = [ sorted([int(i[0]),int(i[2])]) for i in a[1:int(a[0][2])+1]  ]
data
def BFS(data,start_num):
    queue = []  # 队列一
    queue.append(start_num) # 初始节点加入队列
    queue2 = [] # 队列二 方便记录层数
    seen = set()  # 集合判断是否重复
    seen.add(start_num) # 初始节点加入集合
    a=0  # 计算层级
    while (len(queue)>0):
        vertex = queue.pop(0)
        for k,i in enumerate(data):
            not_vertex = i[0] if i[0]!=vertex else i[1] # 乐观来说 节点一定在i里边拿出非节点元素
            if vertex in i and not_vertex not in seen: # 判断节点在不再i 非节点元素是否在集合
#                 print(i)
                data.pop(k) # 删除 i
                queue2.append(not_vertex) # 非节点元素先放到队列二
                seen.add(not_vertex)    # 集合添加 非节点元素
        print(vertex)
        if len(queue2)>0:# 若队列二有元素 说明还需要循环一次
            a+=1
            queue = queue2
            queue2=[]
    print(a*2)
BFS(data,2)
    

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值