刷清橙OJ--A1066.集合合并

来源:互联网 发布:php源代码下载 编辑:程序博客网 时间:2024/06/17 07:37
问题:
A1066. 集合合并
时间限制:1.0s   内存限制:512.0MB  
总提交次数:1867   AC次数:549   平均分:40.62
问题描述
  一开始有n个集合,{1},{2}……{n}。
  定义一个操作,给定两个数a,b,用a,b所在的集合的并集代替a和b原来所在的集合。
  求操作之后的集合个数。
输入格式
  第一行是两个自然数n,m(其中m小于n,m和n小于3000),分别表示一开始的集合个数和操作的总数。
  接下来m行,每行两个整数a,b,表示合并a,b所在集合。
输出格式
  一个整数,即最后的集合个数。
样例输入
6 4
1 2
2 3
3 6
4 5
样例输出
2
代码:
#include <cstdio>using namespace std;int pre[100001];int find(int x) {//查找x的终极祖先int r = x;while (r != pre[r]) {r = pre[r];}return r;}int max(int a, int b) {return a>b ? a : b;}int min(int a, int b) {return a<b ? a : b;}void join(int x, int y) {//合并int fx = find(min(x, y));int fy = find(max(x, y));if (fx != fy)pre[fy] = fx;}int main() {int n, m, a, b, count, flg;while (scanf("%d%d", &n, &m) != EOF) {for (int i = 1;i <= n;i++) {pre[i] = i;}for (int j = 1;j <= m;j++) {scanf("%d%d", &a, &b);join(a, b);}count = 0;for (int k = 1;k <= n;k++) {if (pre[k] == k) {count++;}else {continue;}}printf("%d\n", count);}return 0;}


个人想法:代码来自试题讨论。