问题描述:
警察抓到了n个罪犯,警察根据经验知道他们属于不同的犯罪团伙,却不能判断有多少个团伙,但通过警察的审讯,知道其中一些罪犯之间互相认识,已知同一犯罪团伙的成员之间直接或者间接认识,有可能一个犯罪团伙只有一个人。请你根据已知罪犯之间的关系,确定犯罪团伙的数量。已知罪犯的编号从1到n。
输入:
第一行:n(n<10000,罪犯数量)
第二行:m(m<100000,关系数量)
输出:
一个整数,犯罪团伙的数量。
采用并查集来解决。
#include <stdio.h>
#define _MAX_LIST_SIZE_ 10001
int father[_MAX_LIST_SIZE_];
int list_size;
void init();
int find_set(int i);
void union_set(int x, int y);
int main(){
init();
int relation_number;
scanf("%d", &relation_number);
while(relation_number--){
int x, y;
scanf("%d%d",&x, &y);
union_set(x, y);
}
int sum = 0;
int check_loop;
for(check_loop = 1; check_loop <= list_size; check_loop++) if(check_loop == father[check_loop]) sum++;
printf("%d\n", sum);
return 0;
}
void init(){
scanf("%d", &list_size);
int input_loop;
for(input_loop = 1; input_loop <= list_size; input_loop++) father[input_loop] = input_loop;
}
int find_set(int i){
int grand_father = i;
while(grand_father != father[grand_father]) grand_father = father[grand_father];
return grand_father;
}
void union_set(int x, int y){
int a = find_set(x);
int b = find_set(y);
if(a < b) father[b] = a;
else if( b < a) father[a] = b;
}