def numIslands(grid):
    #获取行数和列数
    nrow = len(grid)
    if nrow == 0:
        return 0
    ncol = len(grid[0])
    if ncol == 0:
        return 0
    #所有1的坐标
    lands = set()
    for i in range(nrow):
        for j in range(ncol):
            if grid[i][j] == "1":
                lands.add((i, j))
    #初始化不相交集
    ds = DisjointSet(list(lands))
    #扫描所有可能相邻的1,不断地union
    for point in lands:
        h_adj_point = (point[0], point[1] + 1)  #右邻居
        v_adj_point = (point[0] + 1, point[1])  #下邻居
        #如果1的右邻居和下邻居都是1,则进行Union
        if h_adj_point in lands:
            ds.Union(point, h_adj_point)
        if v_adj_point in lands:
            ds.Union(point, v_adj_point)
    #最终返回不相交集的数目
    return ds.SetCnt
示例#2
0
def solve(board):
    if board:  #如果board为空则不做任何处理
        nrow, ncol = len(board), len(board[0])
        inner, border = [], []  #记录所有"O"出现的位置,分为内部和边界处
        #扫描,记录所有"O'的位置
        for i in range(nrow):
            for j in range(ncol):
                if board[i][j] == "O":
                    if i == 0 or i == nrow - 1 or j == 0 or j == ncol - 1:
                        border.append((i, j))
                    else:
                        inner.append((i, j))
        #如果边界上无O,则全部转换
        if not border:
            for loc in inner:
                board[loc[0]][loc[1]] = "X"
        else:
            #初始化不相交集
            ds = DisjointSet(border + inner)
            #将边界上的"O"点Union起来
            pivot = border[0]
            for loc in border[1:]:
                ds.Union(pivot, loc)
            #遍历inner和border,建立必要的连接
            for loc in border + inner:
                if loc[0] < nrow - 1:
                    if board[loc[0] + 1][loc[1]] == "O":
                        ds.Union(loc, (loc[0] + 1, loc[1]))
                if loc[1] < ncol - 1:
                    if board[loc[0]][loc[1] + 1] == "O":
                        ds.Union(loc, (loc[0], loc[1] + 1))
            #遍历inner中的点,若其不与border中的点同类,则转换
            for loc in inner:
                if ds.Find(loc) != ds.Find(pivot):
                    board[loc[0]][loc[1]] = "X"
示例#3
0
def findRedundantConnection(edges):
    n = len(edges)  #点的数目
    ds = DisjointSet(range(1, n + 1))  #初始化不相交集,下标从1开始
    PrevSetCnt = ds.SetCnt  #上一步的不相交集数目
    for edge in edges:
        ds.Union(edge[0], edge[1])
        if PrevSetCnt == ds.SetCnt:  #当加入一条边时不相交集的数目没有发生改变,则说明该边是多余的,形成了一个环
            return edge
        PrevSetCnt = ds.SetCnt
def findCircleNum(M):
    n = len(M)
    if n == 0:
        return 0
    #初始化不相交集
    DS = DisjointSet(range(n))
    #扫描M矩阵,完成Union操作
    for i in range(n):
        for j in range(i):
            if M[i][j] == 1:
                DS.Union(i, j)
    #返回不相交集的数目
    return DS.SetCnt