算法-并查集

并查集Union Find

  • 简单地数据结构
  • 很实用的数据结构

UF

class UF{
public:
    explicit UF(int number);
    int find(int x);
    bool connected(int x, int y);
    void unions(int x, int y);
private:
    vector<int> id;
    vector<int> rank;
}
UF::UF(int number){
    id.resize(number);
    iota(id.begin(),id.end(),0);
    rank.resize(number,1);
}
int UF::find(int x){
    while(id[x]!=x) 
        x=find(id[x]);
    return id[x];
}
//iterative
/*
int UF::find(int x){
    while(id[x]!=x){
        id[x]=id[id[x]];
        x=id[x];
    }
    return id[x];
}*/
bool UF:: connected(int x,int y){
    return find(x)==find(y);
}
void UF::unions(int x, int y){
    int root1=find(x);
    int root2=find(y);
    if(root1==root2) return;
    if(rank[root1]<rank[root2]){
        id[root1]=root2;
        rank[root2]+=rank[root1];
    }else{
        id[root2]=id[root1];
        rank[root1]+=rank[root2];
    }   
}

Number of Connected Components in an Undirected Graph

  • 并查集的直接应用
int countComponents(int n,vector<pair<int, int>>& edges){
    int cnt=0;
    UF(n);
    for(auto edge:edges)
        unions(edge.first,edge.second);
    for(int i=0;i<n;i++) 
        if(id[i]==i) 
            cnt++;
    return cnt;
}

Graph Valid Tree

  • 考察一:无环图
  • 考察二:树的边的个数edges=vertices-1
bool ValidTree(int n, vector<pair<int, int>>& edges){
    if(edges.empty() || edges.size()!=n-1) return false;
    UF(n);
    for(auto edge:edges){
        int x=find(edge.first);
        int y=find(edge.second);
        if(x==y) return false;
        id[x]=y;
    }
    return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值