这个题就是一个sb题,但是我也犯了一个sb错误。把Find函数里
int Find(int x)
{
if(fa[x] == x)
return fa[x];
return fa[x] = Find(fa[x]);
}
return fa[x] = Find(fa[x]); = 写成了 ==
怎么做怎么不对…………
另外还有一点就是要看其他的点是否和 1 是在一个集合里,而不是看父节点是否相同。因此判断Find(i) == Find(1),而不是 fa[i] == fa[1]
#include <bits/stdc++.h>
using namespace std;
int n,m;
const int N = 70000;
int Rank[N];
int fa[N];
void init()
{
for(int i=1;i<=N;i++)
{
fa[i]=i;
Rank[i]=1;
}
}
int Find(int x)
{
if(fa[x] == x)
return fa[x];
return fa[x] = Find(fa[x]);
}
bool is_sa(int a,int b)
{
return Find(a) == Find(b);
}
int main()
{
init();
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
int t1=Find(a),t2=Find(b);
if(t1!=t2)//如果不在同一集合内
{
fa[t2]=t1;//把它们并到一个集合内
}
}
int z=0;
for(int i=1;i<=n;i++)
{
if(!is_sa(i,1))
{
cout<<i<<endl;
z++;
}
// cout<<fa[i]<<endl;
}
if(z==0)
cout<<z<<endl;
}