并查集
并查集 - 擒贼先擒王
#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;
}

浙公网安备 33010602011771号