题解 | #最小生成树#

最小生成树

https://www.nowcoder.com/practice/735a34ff4672498b95660f43b7fcd628

class Solution {
public:
    const int inf = 0x3f3f3f3f;
    struct Node{
        int v;
        int c;
        Node(int _v, int _c):v(_v), c(_c){}
        bool operator < (const Node& other) const{
            return c > other.c;
        }
    };
    int Adj[5010][5010];
    int vis[5010];
    int dist[5010];
    int miniSpanningTree(int n, int m, vector<vector<int> >& cost) {
        // write code here
        memset(Adj, inf, sizeof(Adj));
        memset(vis, false, sizeof(vis));
        memset(dist, inf, sizeof(dist));
        for(int i = 0 ; i < m; i ++){
            int u = cost[i][0] - 1;
            int v = cost[i][1] - 1;
            int c = cost[i][2];
            //去重边
            Adj[u][v] = min(Adj[u][v], c);
            Adj[v][u] = min(Adj[v][u], c);
        }
        priority_queue<Node> pq;
        pq.push({0, 0});
        dist[0] = 0;
        int ans = 0;
        int cnt = 0; //已经加入生成树集合的村庄数
        while(!pq.empty()){
            Node node = pq.top(); pq.pop();
            int u = node.v, cos = node.c;
            if(!vis[u]){
                ans += cos;
                vis[u] = true;
                cnt ++;
                if(cnt == n) break;
            }else continue;
            for(int v = 0; v < n; v ++){
                if(Adj[u][v] == inf) continue;
                int c = Adj[u][v];
                if(!vis[v] && c < dist[v]){
                    pq.push({v, c});
                    dist[v] = c;
                }
            }
        }
        return ans;
    }
};

全部评论

相关推荐

10-05 23:02
东北大学 Java
我说句实话啊:那时候看三个月培训班视频,随便做个项目背点八股,都能说3 40w是侮辱价
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务