#include<bits/stdc++.h>
using namespace std;
vector<int>g[1005];
int n=1,m=1,vis[1005];
void dfs(int u)
{
if(vis[u])return ;
vis[u]=1;
for(int v:g[u])dfs(v);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
while(cin)
{
memset(vis,0,sizeof(vis));
cin>>n;
for(int i=0;i<=n;i++)g[i].clear();
if(!n)break;
cin>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
int ans=-1;
for(int i=1;i<=n;i++)
{
if(!vis[i])dfs(i),ans++;
}
cout<<ans<<'\n';
}
}
这个以连通块遍历为基础的代码能过
但是个人认为其可能错误且不能为正解
在此求 Hack