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;
}