0
点赞
收藏
分享

微信扫一扫

数据结构——最小生成树模板

ITWYY 2022-04-26 阅读 80
开发语言

参考文章图解:什么是最小生成树?

    vector<int> parents;
    int count;
    void init(int n){
        count = n+1;
        parents = vector<int>(n+1, 0);
        for(int i=0; i<=n; ++i){
            parents[i] = i;
        }
    }

    int find(int x){
        if(x != parents[x])
            return find(parents[x]);
        return parents[x];
    }

    void Union(int x, int y){
        int rootX = find(x);
        int rootY = find(y);
        if(rootX == rootY)
            return ;
        parents[rootX] = rootY;
        count--;
        }

    bool isConnected(int x, int y){
        return find(x) == find(y);
    }
	/*
	输入:
		n, 节点数量
		connections, {{a, b, w}} 无向图中的起点、终点、权重
	*/
    int minimumCost(int n, vector<vector<int>>& connections) {
        sort(connections.begin(), connections.end(), [&](vector<int>& a, vector<int>& b){
            return a[2] < b[2];
        });
        init(n);
        int ans = 0;
        for(int i=0; i<connections.size(); ++i){
            int x,y,w;
            x = connections[i][0];
            y = connections[i][1];
            w = connections[i][2];

            if(! isConnected(x, y)){
                Union(x, y);
                ans += w;
            }

        }
        return count == 2? ans : -1;
    }
举报

相关推荐

0 条评论