题目:擒贼先擒王
快过年了,犯罪分子也开始为年终奖奋斗了。晓哼的家乡出现了多次抢劫事件。由于强盗人数过于庞大,作案频繁,警方想查清楚到底有几个犯罪团伙实在太不容易了,不过警察叔叔还是蒐集到了一些线索,需要咱们帮忙分析一下:
现在有10个强盗。
- 1号强盗与2号强盗是同伙。
- 3号强盗与4号强盗是同伙。
- 5号强盗与2号强盗是同伙。
- 4号强盗与6号强盗是同伙。
- 2号强盗与6号强盗是同伙。
- 8号强盗与7号强盗是同伙。
- 9号强盗与7号强盗是同伙。
- 1号强盗与6号强盗是同伙。
- 2号强盗与4号强盗是同伙。
有一点需要注意,强盗同伙的同伙也是同伙。你能帮助警方查出有多少个独立的犯罪团伙吗?
输入一下数据:
第一行n m,n表示强盗的人数,m表示警方蒐集到的m条线索。接下来的m行每一行有两个数 a b。
表示强盗a和强盗b是同伙。
input
10 9
- 1 2
- 3 4
- 5 2
- 4 6
- 2 6
- 8 7
- 9 7
- 1 6
- 2 4
output: 3
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
int change(int L, int *BOSS){
if(L == BOSS[L]){
return L;
}
else{
BOSS[L] = change(BOSS[L], BOSS);
return BOSS[L];
}
}
void marget(int L, int R, int *BOSS){
L = change(L, BOSS);
R = change(R, BOSS);
if(BOSS[L]!=BOSS[R]){
BOSS[R] = L;
}
}
int main()
{
int N, M, Count = 0, note = 0;
cin >> N >> M;
int *BOSS = new int[N+1], *Res = new int[N];
for(int i = 1; i <= N; i++){
BOSS[i] = i;
}
int L, R;
for(int i = 0; i < M; i++){
cin >> L >> R;
marget(L, R, BOSS);
}
for(int i = 1; i <= N; i++){
BOSS[i] = change(i, BOSS);
if(note == 0){
Res[note++] = BOSS[i];
Count++;
}
else{
int tmp = 1;
for(int j = 0; j < note; j++){
if(Res[j]==BOSS[i]){
tmp = 0;
break;
}
}
if(tmp){
Res[note++] = BOSS[i];
Count++;
}
}
}
cout << Count << endl;
return 0;
}