leetcode 1319.连通网络的操作次数

  已经连通的点可以视为集合,用并查集记录集合,搜一遍得到集合个数。设点数为$n$,边数为$s$,集合个数为$num$。那么有两种情况:

  1)$s<n-1$,不能全部连通。

  2)$s>=n-1$,最少操作数是$num-1$。(随便取冗边,反正能把集合都连起来就行。因为$s>=n-1$,所以是肯定能取到冗边的,不用管怎么取。)

int s;

int fa[100007];
int find(int a){
    return fa[a]==a?a:fa[a]=find(fa[a]);
}

bool flag[100007];
int num;    // the number of sets

class Solution {
public:
    int makeConnected(int n, vector<vector<int>>& connections) {
        s=connections.size();   // the number of edges
        if (s+1<n)
            return -1;
        for (int i=0;i<n;i++)
            fa[i]=i;
        for (int i=0,a,b;i<s;i++){
            a=find(connections[i][0]),b=find(connections[i][1]);
            if (a!=b)
                fa[a]=b;
        }
        num=0;
        for (int i=0;i<n;i++)
            if (i==find(i))
                num++;
        return num-1;   
    }
};

//

 

posted @ 2021-06-19 16:55  wegret  阅读(74)  评论(0)    收藏  举报