广播服务器 - 华为OD机试2022
题目描述
解题思路
思路:本质是图的遍历, 计算多少个连通图。
- 初始化一个邻接表,key和value相等,数量是所有的行数(方阵)
- 遍历所有的位置, (当前点是0也不考虑,i==j这种情况是自己和自己相连不考虑。) 考虑的是当前点是1and i!=j, 后者表示两个不同的点相连。如果这两个点在tag中的标号也就是value相同,表示连通,不作任何操作,如果不同,表示不连通,需要将两者连通起来,也就是使两者的value相等,大的标号向小的标号对齐。(之前看最小生成树就是这样做的,小的标号向大的标号看齐就会错误,不知道为啥。)
- 最后把value做个集合,求个数就可以了。
python代码
''' 思路:本质是图的遍历, 计算多少个连通图 这个题借鉴了最小生成树中的回路判断: https://www.nowcoder.com/discuss/466406145142300672?sourceSSR=users ''' def cal(matrix): # 矩阵是方阵 # 邻接表初始化, 遍历方阵, 如果联通就大的标号向小的标号看齐。 n = len(matrix) tag = {i:i for i in range(n)} # {0: 0, 1: 0, 2: 2} for i in range(n): for j in range(n): if matrix[i][j] == 1 and i != j: if tag[i] != tag[j]: # 把边对应的两个节点对应的编号置为相同,大的向小的看齐。 max_v = max(tag[i], tag[j]) # 找顶点标号大的 min_v = min(tag[i], tag[j]) # 找顶点标号小的 for i in range(n): # 找所有的顶点 if tag[i] == max_v: # 顶点对应的标号等于大的那个 tag[i] = min_v # 大的标号向小的标号看齐 print(tag) # value相同的视为一个联通图,计算多少个不同的value 就是多少个连通图 num = len(set(tag.values())) return num # matrix= [[1,1,0],[1,1,0],[0,0,1]] # matrix= [[1,0,0],[0,1,0],[0,0,1]] # matrix= [[1,1],[1,1]] matrix= [[1,1,0,0],[1,1,0,1],[0,0,1,1],[0,1,1,1]] # 1 print(cal(matrix))