[啊哈算法]擒贼先擒王(并查集)

Description
警察想查清楚有几个犯罪团伙,搜集到了一些线索:

现在有10个强盗;

1号强盗与2号强盗是同伙;

3号强盗与4号强盗是同伙;

5号强盗与2号强盗是同伙;

4号强盗与6号强盗是同伙;

2号强盗与6号强盗是同伙;

8号强盗与7号强盗是同伙;

9号强盗与7号强盗是同伙;

1号强盗与6号强盗是同伙;

2号强盗与4号强盗是同伙;

强盗同伙的同伙也是同伙,请问一共有多少个独立的犯罪团伙?

Input
第一行n,m,分别表示强盗人数,和线索条数,接下来m行有两个数a,b,表示a和b是同伙。

Output
输出一个整数,表示犯罪团伙的数量

Sample Input
10 9
1 2
3 4
5 2
4 6
2 6
8 7
9 7
1 6
2 4
Sample Output
3

#include<iostream>
using namespace std;
int f[1000]= {0},n,m,sum=0;
void init() {
	for(int i=1; i<=n; i++)
		f[i]=i;
	//对指定的前n项数据进行初始化
}
int getf(int v) {
	if(f[v]==v)//如果v位置的强盗的BOSS仍然是他自己的话那么返回最终结果
		return v;
	else {
		f[v]=getf(f[v]);//通过逐级迭代依次寻找上一级的BOSS来获得最终该最值强盗的最终BOSS
		return f[v];
	}
}
void merge(int v,int u) {
	int t1, t2;
	t1=getf(f[v]);
	t2=getf(f[u]);
	//首先分别寻找到该两个数据的BOSS


	if(t1==t2)return;
	else {
//如果不相等的或执行靠左原则 
		f[t2]=t1;



	}









}
int main() {

	int i,x,y;
	cin>>n>>m;
	init();//注意先输入n 的值之后在进行初始化 
	for(i=1; i<=m; i++) {
		cin>>x>>y;//每输入一对数据就进行判断是否能进行合并 
		merge(x,y);

	}
	for(i=1; i<=n; i++) {
		if(f[i]==i)
			sum++;//若有一个强盗的头目仍然是他自己那么他就代表一个集团 

	}
	cout<<sum;
	return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值