Posted on

Description

Submission

class Solution {
    static constexpr int maxLen = 1e5 + 5;
    bool check(int n, int state, int maxDistance, vector<vector<int>>& nextNodes) {
        if (__builtin_popcount(state) <= 1) return true;
        
        vector<vector<int>> dist(n, vector<int>(n, maxLen));
        
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                dist[i][j] = dist[j][i] = nextNodes[i][j];
            }
        }
        
        for (int k = 0; k < n; ++k) {
            if (!((state>>k)&1)) continue;
            for (int i = 0; i < n; ++i) {
                if (!((state>>i)&1)) continue;
                for (int j = 0; j < n; ++j) {
                    if (!((state>>j)&1)) continue;
                    dist[i][j] = min(dist[i][j], dist[i][k] + dist[j][k]);
                }
            }
        }
        
        for (int i = 0; i < n; ++i) {
            if (!((state>>i)&1)) continue;
            for (int j = 0; j < n; ++j) {
                if (!((state>>j)&1)) continue;
                if (dist[i][j] > maxDistance) return false;
            }
        }
        
        return true;
    }
public:
    int numberOfSets(int n, int maxDistance, vector<vector<int>>& roads) {
        vector<vector<int>> nextNodes(n, vector<int>(n, maxLen));
        
        for (auto& road: roads) {
            int u = road[0], v = road[1], w = road[2];
            nextNodes[u][v] = min(nextNodes[u][v], w);
            nextNodes[v][u] = min(nextNodes[v][u], w);
        }
        
        for (int i = 0; i < n; ++i) {
            nextNodes[i][i] = 0;
        }
        
        int ret = 0;
        for (int state = 0; state < (1 << n); ++state) {
            if (check(n, state, maxDistance, nextNodes)) {
                ++ret;
            }
        }
        
        return ret;
        
    }
};

// 2 << 10 = 1024

Leave a Reply

Your email address will not be published. Required fields are marked *