犯罪团伙(gang.cpp)

我在网上搜这道题的时候搜出来一堆犯罪团伙在世界上造成的恶劣影响,这道题名起的真的绝了......

我化学砸了!  !  !我化学砸了!!!我化学砸了!!!

现在整个人都无比颓废......


题目描述
 警察抓到了n个罪犯,警察根据经验知道他们属于不同的犯罪团伙,却不能判断有多少个团伙,但通过警察的审讯,知道其中的一些罪犯之间相互认识,已知同一犯罪团伙的成员之间直接或间接认识。有可能一个犯罪团伙只有一个人。请你根据已知罪犯之间的关系,确定犯罪团伙的数量。已知罪犯的编号从1至n。

输入
 第1行:n(<=500,罪犯数量),m(<50000,关系数量)以下m行:每行两个数:i 和j,中间一个空格隔开,表示罪犯i和罪犯j相互认识。


输出
 第1行:一个整数,犯罪团伙的数量。

样例输入
11 8
1 2
4 3
5 4
1 3
5 6
7 10
5 10
8 9

样例输出
3

然后我当时觉得这个东西应该用并查集做,但是我忘了并查集该怎么写了,于是我就开始一顿乱蒙,写出来了这个东西,我也不知道它对不对呀

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 int f[10001],g[10001];
 8 int main()
 9 {
10     //freopen("gang.in","r",stdin);
11     //freopen("gang.out","w",stdout);
12     int m,n,i,j;
13     scanf("%d",&n);
14     scanf("%d",&m);
15     for(int x = 1;x <= m;x++)
16     {
17         scanf("%d %d",&i,&j);//f[i]表示i的爸爸,g[i]表示i的祖先 
18         if(f[j] != 0 && f[i] == 0) f[i] = j,g[i] = g[j];
19         if(f[i] != 0 && f[j] == 0) f[j] = i,g[j] = g[i];
20         if(f[i] == 0 && f[j] == 0) f[i] = j,g[i] = j,g[j] = j; 
21         if(f[i] != 0 && f[j] != 0) f[g[i]] = j;//当两个点都有爸爸时,把其中一个的祖先变为另一个的儿子,使两棵树连在一起 
22     }
23     int ans = 0;
24     sort(g + 1,g + n + 1);
25     for(int i = 1;i <= n;i++)
26     {
27         if(g[i] != g[i + 1]) ans++;
28     }
29     printf("%d",ans);
30     return 0;
31 }
32     

 

反正对不对等我明天去学校测一下就知道了