题目:
给出一个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的点的坐标
比如:[(2, 0), (3, 1), (4, 3)] - 初始化未分组的点
{0,1,2,3,4} - 从第一个元素 找出可以合并的组,并从未分组中移除。
- 重复3 直到全部元素合并分组完成
- 分组+ 独立点的数量和, 即为最小数
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。