1319. Number of Operations to Make Network Connected刷题笔记

问题描述
第一版代码:
主要是解决了无向图和孤立点的特殊情况,根据孤立点个数和最大连通子图数来计算需要的边数。虽然结果是正确的,但是超时了

import collections
class Solution:
    def makeConnected(self, n: int, connections):
        length = len(connections)
        if length<n-1:
            return -1
        cluster_num = 0
        checked = collections.deque()

        while connections:
            to_check = collections.deque([connections[0][0]])
            while to_check:
                start = to_check.popleft()
                checked += [start]
                i = 0
                while i < length:
                    [x,y] = connections[i]
                    if x == start or y==start:
                        del connections[i]
                        length -= 1
                        if x == start:
                            if y not in to_check and y not in checked:
                                to_check.append(y)
                        else:
                            if x not in to_check and x not in checked:
                                to_check.append(x)
                    else:
                        i += 1

            cluster_num += 1
        return cluster_num-1+(n-len(checked))

n = 12
connections = [[1,5],[1,7],[1,2],[1,4],[3,7],[4,7],[3,5],[0,6],[0,1],[0,4],[2,6],[0,3],[0,2]]
print(Solution().makeConnected(n,connections))

于是撰写第二版代码
这种递归算法,虽然结果是一样的,但是速度快了不少
LeetCode代码:

class Solution:
    def makeConnected(self, n: int, connections: List[List[int]]) -> int:
        if len(connections)<n-1:
            return -1
        G = [set() for i in range(n)]
        for i,j in connections:
            G[i].add(j)
            G[j].add(i)
        seen = [0]*n

        def dfs(x):
            if seen[x]:
                return 0
            seen[x]=1
            for i in G[x]:
                dfs(i)
            return 1

        return sum(dfs(i) for i in range(n))-1

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值