说什么并查集,就是数连通块。
#include<bits/stdc++.h> using namespace std; const int maxn=1005; int a[maxn][maxn]; int vis[maxn]; int n,m; void dfs(int x){ if(vis[x])return; vis[x]=1; for(int i=1;i<=n;i++) if(a[i][x])dfs(i); } int main(){ int t; cin>>t; while(t--){ cin>>n>>m; memset(vis,0,sizeof(vis)); memset(a,0,sizeof(a)); int x,y; for(int i=1;i<=m;i++){ cin>>x>>y; a[x][y]=a[y][x]=1; } int ans=0; for(int i=1;i<=n;i++) if(!vis[i]){ ans++; dfs(i); } printf("%d ",ans); } }