以下代码是输出有多少个集合。
模板题。
#include<iostream> using namespace std; int a[1007], ans; int find(int x) //找根 { int r = a[x]; while (r != a[r]) { //不断查找其父亲,当自己值等于其位置为对应集合树的根 r = a[r]; } return r; } void change(int x, int y)//合并两个集合 { int fx = find(x); int fy = find(y); if (fx != fy) { //当x,y的根不同时,证明是两个集合,于是连接两个集合(将x接到根y之下) a[fx] = fy; } } int main() { int M, N, b, c; while (scanf("%d", &N),N) { ans = 0; scanf("%d", &M); for (int i = 1;i <= N;i++)//初始化 a[i] = i; for (int i = 0;i < M;i++) { scanf("%d%d", &b, &c); change(b, c); //尝试将b,c所属集合连接 } for (int i = 1;i <= N;i++) if (i == a[i]) //寻找根,找到就认为找到了一个集合 ans++; printf("%d\n", ans); } }
原文:https://www.cnblogs.com/20km-shimakaze/p/14669290.html