就是你考试的时候把并查集代码背错了导致你被迫去写了这个代码,但是也是好事,你现在对于dfs的理解可谓是真正地加深了许多。
思路
每个点,进一个点就res++。然后把所有邻接的点都加进来,所以最后res是几就代表有几块。
遍历图
就是很重要的一点就是,再每次dfs之前需要去判断一下的。如果是没走过这个点你才去走,要不然因为是无向图,会导致不断你进我,我进你,一直走不出去的情况。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
vector<int> v[N];
bool st[N];
void dfs(int idx){
st[idx] = true;
for(auto it: v[idx]){
if(st[it] == false)
dfs(it);
}
}
int main(){
int t;
cin>>t;
while(t--){
memset(st,false,sizeof st);
memset(v,0,sizeof v);
int n,m;
cin>>n>>m;
int a,b;
for(int i=0;i<m;i++){
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
int res = 0;
for(int i=1;i<=n;i++){
if(st[i]==false){
res++;
dfs(i);
}
}
cout<<n-res<<endl;
}
}