Leetcode 2959. Number of Possible Sets of Closing Branches

1. 解题思路

这一题虽然是一个hard的题目,不过其实思路上也并不难,由于最多只有10个节点,因此,我们可以直接考察全部的至多 2 10 2^{10} 210种组合,考察每一种情况下的子图是否满足条件即可。

而对于每一个具体的子图,事实上就是一个求图中任意两点间最小距离的问题,这个是个典型的图问题,用Floyd算法就可以直接得到答案了。

不过比较尴尬的是,虽然我知道有算法可以直接干这个事,不过具体的Floyd算法和DijkStra算法已经基本忘干净,最后还是网上找了个现成的code完成的,就很坑爹……

后面花点时间单独重新整理一下这俩算法吧……

2. 代码实现

给出python代码实现如下:

class Solution:
    def numberOfSets(self, n: int, maxDistance: int, roads: List[List[int]]) -> int:
        roads = sorted(roads, key=lambda x: x[-1])
        valid_roads = []
        seen = set()
        for u, v, w in roads:
            if (u, v) in seen:
                continue
            if w > maxDistance:
                break
            valid_roads.append((u, v, w))
            seen.add((u, v))
            seen.add((v, u))
                
        @lru_cache(None)
        def get_min_distance(status):
            distances = [[0 if i == j else math.inf for i in range(n)] for j in range(n)]
            
            for u, v, w in valid_roads:
                if ((status >> u) & 1) & ((status >> v) & 1):
                    distances[u][v] = distances[v][u] = w

            for o in range(n):
                for u in range(n):
                    for v in range(n):
                        distances[u][v] = min(distances[u][o] + distances[o][v], distances[u][v])
                        distances[v][u] = min(distances[u][o] + distances[o][v], distances[v][u])
            return distances

        @lru_cache(None)
        def dfs(idx, status):
            if idx == n:
                distances = get_min_distance(status)
                return 1 if all(distances[u][v] <= maxDistance for u in range(n) for v in range(u+1, n) if ((status >> u) & 1) & ((status >> v) & 1)) else 0
            return dfs(idx+1, status) + dfs(idx+1, status | (1 << idx))
            
        return dfs(0, 0)

提交代码评测得到:耗时8546ms,占用内存53.1MB。

相关推荐

  1. leetcode299--猜数字游戏

    2023-12-11 16:30:02       18 阅读
  2. Leetcode 2959. Number of Possible Sets of Closing Branches

    2023-12-11 16:30:02       42 阅读
  3. Leetcode 2949. Count Beautiful Substrings II

    2023-12-11 16:30:02       40 阅读
  4. leetcode 2952.需要添加的硬币的最小数量

    2023-12-11 16:30:02       16 阅读
  5. 【堆】Leetcode 295. 数据流的中位数【困难】

    2023-12-11 16:30:02       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-11 16:30:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-11 16:30:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-11 16:30:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-11 16:30:02       18 阅读

热门阅读

  1. AES加密的使用笔记(ECB和GCM加密模式-前端)

    2023-12-11 16:30:02       39 阅读
  2. 《C++新经典设计模式》之第17章 中介者模式

    2023-12-11 16:30:02       24 阅读
  3. H3C网络设备交换机风扇亮黄灯故障处理

    2023-12-11 16:30:02       74 阅读
  4. PTA 7-226 sdut-C语言实验-矩阵输出(数组移位)

    2023-12-11 16:30:02       42 阅读
  5. C项目编译和链接[CL]

    2023-12-11 16:30:02       31 阅读
  6. docker的镜像创建 dockerfile

    2023-12-11 16:30:02       32 阅读
  7. SQL注入一般过程

    2023-12-11 16:30:02       34 阅读
  8. Linux 服务器内开放指定的端口

    2023-12-11 16:30:02       39 阅读
  9. 【React】react-router-dom路由导航的跳转及传参

    2023-12-11 16:30:02       43 阅读
  10. 深度学习为什么要进行训练

    2023-12-11 16:30:02       32 阅读
  11. PHP中对象数组化

    2023-12-11 16:30:02       36 阅读
  12. vue项目列表跳转详情返回列表页保留搜索条件

    2023-12-11 16:30:02       40 阅读
  13. 了解linux计划任务

    2023-12-11 16:30:02       41 阅读