自学内容网 自学内容网

并查集---服务器广播

题目描述
服务器连接方式包括直接相连,间接相连。A和B直接连接,B和C直接连接,则A和C间接连接。直接连接和间接连接都可以发送广播。

给出一个 N * N 数组,代表N个服务器,

matrix[i][j] == 1,则代表 i 和 j 直接连接;不等于1时,代表 i 和 j 不直接连接。
matrix[i][i] == 1, 即自己和自己直接连接。
matrix[i][j] == matrix[j][i]。
计算初始需要给几台服务器广播,才可以使每个服务器都收到广播。

输入描述
输入为N行,每行有N个数字,为0或1,由空格分隔,构成N*N的数组,N的范围为 1 <= N <= 40

输出描述
输出一个数字,为需要广播的服务器的数量

用例1
输入
1 0 0
0 1 0
0 0 1
输出
3
说明
3台服务器互不连接,所以需要分别广播这3台服务器

用例2
输入
1 1
1 1
输出
1
说明
2台服务器互相连接,所以只需要广播其中一台服务器

class Union:
    def __init__(self,n):
        # 初始化并查集,创建一个父节点数组 fa
        # 每个元素的父节点初始化为它本身
        self.fa = [i for i in range(n)]
        #记录当前连通组件的数量
        self.count = n

    def find(self,x):
        if x!=self.fa[x]:
            self.fa[x]=self.find(self.fa[x])
            return self.fa[x]
        return x
    def union(self,x,y):
        x_fa = self.find(x)
        y_fa = self.find(y)
        if x_fa!=y_fa:
            self.fa[y_fa] = x_fa
            self.count-=1
arrays=[]
while True:
    try:
        arrays.append(input().split())
    except:
        break
n = len(arrays)
ufs = Union(n)
for i in range(n):
    for j in range(n):
        if arrays[i][j]=='1':
            ufs.union(i,j)
print(ufs.count)

原文地址:https://blog.csdn.net/TTz012/article/details/143889318

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!