上一篇的博文代码是70PAC,有三个点超时,主要原因就是find函数里面没有进行路径压缩
#include<bits/stdc++.h>//上一篇博文代码,无路径压缩的
using namespace std;
int n;
int m;
int fa[10001];
int find(int x)
{
if(fa[x]==x) return x;
else return find(fa[x]);
}
bool check(int x,int y)
{
x=find(x);
y=find(y);
if(x==y) return 1;
else return 0;
}
void unition(int x,int y)
{
x=find(x);
y=find(y);
fa[x]=y;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++)
{
int z;
int x;
int y;
cin>>z>>x>>y;
if(z==1)
{
unition(x,y);
}
else
{
if(check(x,y)==1) cout<<"Y"<<endl;
else cout<<"N"<<endl;
}
}
return 0;
}
下面的是ac的,加路径压缩的代码呈上
#include<bits/stdc++.h>
using namespace std;
int n;
int m;
int fa[10001];
int find(int x)
{
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);//敲重点,路径压缩,否则会超时部分点的
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++)
{
int z;
int x;
int y;
cin>>z>>x>>y;
if(z==1)
{
fa[find(x)]=find(y);
}
else
{
if(find(x)==find(y)) cout<<"Y"<<endl;
else cout<<"N"<<endl;
}
}
return 0;
}