题意:
给出一个图,请你给出这个图里连通分量的数目。
本题中的图都为无向图。
思路:
利用并查集。每输入一组顶点就将其联合,最后只需要统计根顶点等于自身的顶点个数即可。
源码:
#include<iostream>
#include<vector>
using namespace std;
int Find(vector<int>& father, int x) { //查找节点的根顶点
if (father[x] == -1)
return x;
return father[x] = Find(father, father[x]); //同时将此顶点及其上级顶点更新为同一个根顶点
}
void Union(vector<int>& father, int x, int y) { //将两顶点联合成同一个根顶点
x = Find(father, x);
y = Find(father, y);
if (x != y)
father[x] = y;
}
int main() {
int n, m;
cin >> n >> m;
vector<int>father(n, -1); //初始化根顶点向量
for (int i = 0; i < m; i++) {
int x, y;
cin >> x >> y;
Union(father, x, y); //将一组顶点联合
}
int cnt = 0;//记录连通分量
for (int i = 0; i < n; i++)
if (Find(father, i) == i) //一个连通分量拥有同一个根顶点
cnt++;
cout << cnt;
return 0;
}
ps:下方代码能够巧妙地更新同一连通分量地所有顶点地根顶点。
return father[x] = Find(father, father[x]);