[H最短路] lc2959. 关闭分部的可行集合数目(Floyd最短路+二进制枚举+模板题)

1. 题目来源

链接:2959. 关闭分部的可行集合数目

2. 题目解析

看了看题好像还没啥思路,结果一看数据范围,好家伙…n 最大就 10 啊,那不直接闭眼直接 Floyd+枚举所有情况即可吗???

果然算法评级只有 6…只需要熟练掌握数据结构即可。
在这里插入图片描述
坑点

  • 最终要保持连通,需要特殊判断一下 在这里 WA 一次
  • 无向图建双向边

  • 时间复杂度 O ( 2 n ∗ n 3 ) O(2^n*n^3) O(2nn3)
  • 空间复杂度 O ( n 2 ) O(n^2) O(n2)

class Solution {
public:
    int numberOfSets(int n, int maxDistance, vector<vector<int>>& roads) {
        int r = roads.size();
        // 2进制枚举
        int res = 0;
        vector<bool> del(n);
        for (int i = 0; i < 1 << n; i ++ ) {
            for (int j = 0; j < n; j ++ ) del[j] = false;
            for (int j = 0; j < n; j ++ ) 
                if ((i >> j) & 1) 
                    del[j] = true;
            
            // floyd 建图
            int d[n][n]; memset(d, 0x3f, sizeof d);
            for (int j = 0; j < n; j ++ ) d[j][j] = 0;
            for (int j = 0; j < roads.size(); j ++ ) {
                int x = roads[j][0], y = roads[j][1], w = roads[j][2];
                if (del[x] || del[y]) continue;
                d[x][y] = min(d[x][y], w);
                d[y][x] = min(d[y][x], w);
            }

            // 最短路计算
            for (int j = 0; j < n; j ++ )
                for (int k = 0; k < n; k ++ )
                    for (int m = 0; m < n; m ++ )
                        d[k][m] = min(d[k][m], d[k][j] + d[j][m]);

            // 校验
            int check = 1;
            for (int j = 0; j < n; j ++ ) {
                for (int k = 0; k < n; k ++ ) {
                    if (del[j] || del[k]) continue;
                    if (d[j][k] == 0x3f3f3f3f || d[j][k] > maxDistance) check = 0;
                }
            }

            res += check;
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值