1

题目:
给出一个m*m 的二维矩阵,m代表信号接收点数量 矩阵由 0和1 构成,如果对应位置为1代表两个地点连通, 试问至少需要多少个信号发射器,能保证所有地点都能接收到信号,例如:
[[1., 0., 1., 0., 0.],
[0., 1., 0., 1., 0.],
[1., 0., 1., 0., 0.],
[0., 1., 0., 1., 1.],
[0., 0., 0., 1., 1.]]

位置0 和2 连通, 1,3 ,4不与其他连通,那么至少需要信号发射器2个

分析:
这道题目其实是求解独立不相交的组 的数量
我的思路是:

  1. 找出位置为1的点的坐标
    比如:[(2, 0), (3, 1), (4, 3)]
  2. 初始化未分组的点
    {0,1,2,3,4}
  3. 从第一个元素 找出可以合并的组,并从未分组中移除。
  4. 重复3 直到全部元素合并分组完成
  5. 分组+ 独立点的数量和, 即为最小数
def get_nin_count(arr):

    def f(related_nodes):
        """以第一组为基准,扫描可以与之合并的组"""
        target= related_nodes[0]
        remain = []
        for g in related_nodes[1:]:
            # 如果有交集合并,否则放入待分组的集合中
            if target & g:
                 target |= g
            else:
                remain.append(g)
        return target, remain
    
    m = len(arr)
    groups, remain_nodes = [], set(range(m))
    # 查找有关联的点
    remain = []
    for i in range(m):
        for j in range(i):
            if arr[i][j] == 1:
                remain.append({i,j})
    # 直到所有的      
    while remain:
        print(remain)
        g, remain = f(remain)
        groups.append(g)
        remain_nodes -= g
    return len(groups) + len(remain_nodes)
    

测试一下

arr1 = [[1, 0, 1, 0, 0],
       [0, 1, 0, 1, 0],
       [1, 0, 1, 0, 0],
       [0, 1, 0, 1, 1],
       [0, 0, 0, 1, 1]]

get_min_count(arr1)  # 2

tracer85
1 声望1 粉丝