并查集

并查集 - 擒贼先擒王

#include "stdio.h"
int f[1005], n, m;
void init(){
    int i;
    for(i = 1; i <= n; i++){
        f[i] = i;
    }
}
int find(int x){
    if(f[x] == x)return x;
    else            return f[x] = find(f[x]);//路径压缩

}
void merge(int a, int b){
    int x = find(a);
    int y = find(b);
    if(x != y){
        f[y] = x;//让 a 和 b 的成为伙伴,b 的老大为 a
    }
}
int main(){
    int i, a, b;
    scanf("%d%d",&n,&m);
    init();
    for(i = 0; i < m; i++){
        scanf("%d%d",&a,&b);
        merge(a, b);
    }
    for(i = 1; i <= n; i++){
        printf("%d  ",f[i]);
    }
    
    return 0;
}            

  

posted @ 2021-04-17 14:47  荣荣荣荣荣荣  阅读(29)  评论(0)    收藏  举报