给出一个无向图G,求其连通分量的数量。
输入格式:
第1行输入正整数N(0<N≤1000)和E(0<E≤5000),为顶点个数和边数。 N个结点的序号依次为1~N,接下来E行每行输入连接边的两个顶点编号。
输出格式:
输出以上图的连通分量的数目。
输入样例1:
7 5
5 6
1 2
1 4
2 3
3 4
输出样例1:
3
输入样例2:
8 7
1 2
1 6
2 3
2 7
3 5
4 5
5 8
输出样例2:
1
输入样例3:
8 0
输出样例3:
8
#include<bits/stdc++.h> using namespace std; int p[10000]; int find(int x)//并查集查找树根 { if(p[x]!=x)//如果父节点不同 p[x]=find(p[x]);//则把子节点连接父节点并用到一个同父节点; return p[x];//如果相同则输出父节点 } int main() { int n,m; int x,y; cin>>n>>m; for(int i=0;i<=n;i++) p[i]=i;//初始化,每个数据即为自己父节点 for(int i=1;i<=m;i++) { scanf("%d %d",&x,&y); p[find(x)]=find(y);//使俩个数据连接,并使用相同一个父节点 同个数据 } int cnt=0; for(int i=1;i<=n;i++) if(p[i]==i)//判断有几个父节点 即为几个连通分量 cnt++;//计数 printf("%d",cnt);//输出 return 0; }