并查集求连通块个数的模板
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5+5; vector<int>G[maxn]; bool isRoot[maxn] = {false}; int pre[maxn]; void init(int n){ for(int i = 0; i <= n; i++) pre[i] = i; } int find(int x){ if(pre[x] == x) return x; else return pre[x] = find(pre[x]); } void mix(int a, int b){ int fa = find(a), fb = find(b); if(fa != fb){ pre[fa] = fb; } } int cul(int n){ int ans = 0; for(int i = 1; i <= n; i++){ isRoot[find(i)] = true; } for(int i = 1; i <= n; i++){ ans += isRoot[i]; } return ans; } int main() { int n; scanf("%d", &n); init(n); for(int i = 1; i < n; i++){ int a, b; scanf("%d%d", &a, &b); mix(a, b); } //连通块个数 int cnt = cul(n); printf("%d\n", cnt); return 0; } Input : 5 1 2 1 3 1 4 2 5 Output: 1 Input: 5 1 3 1 4 2 5 3 4 Output: 2
求连通块个数(使用并查集)
最新推荐文章于 2022-07-19 12:32:19 发布