思路
并查集找到联通块的个数,答案就是联通块个数减一。
因为这是无向图,所以就不用dfs跑个数了,直接裸的并查集就好了
如果没有学过并查集可以去看看这篇博客,这位大佬写的巨详细
那就直接上代码了
代码
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 100005; #define stop system("pause") inline ll read(){ ll s = 0, w = 1; char ch = getchar(); while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); } while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar(); return s * w; } int fa[maxn]; int find(int x){ return x == fa[x] ? x : (fa[x] = find(fa[x])); } void merge(int x,int y){ int i = find(x); int j = find(y); fa[i] = j; } void init(){ for(int i = 0 ; i < maxn ; ++i) fa[i] = i ; } int main(){ int n = read(),m = read(); init(); for(int i = 1 ; i <= m ; ++i){ int x = read(),y = read(); merge(x,y); } int ans = 0; for(int i = 1 ; i <= n ; ++i){ if(find(i) == i) ++ans; } cout<<ans - 1<<endl; }