犯罪团伙

问题描述:

警察抓到了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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章