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