tj
2026-05-17 10:47:29
发布于:广东
3阅读
0回复
0点赞
绝对是最经典(也是最简单的)的并查集
#include<bits/stdc++.h>
using namespace std;
int fa[1000000];
int sixseven(int x){
if(x==fa[x])
return x;
else
return sixseven(fa[x]);
}
void merge(int x, int y)
{
fa[sixseven(x)]=sixseven(y);
}
int main()
{
int n,m,p;cin>>n>>m>>p;
for(int i = 1;i <= n;i++){
fa[i] = i;
}
while(m--)
{
int mi,mj;cin>>mi>>mj;
merge(mi,mj);
}
while(p--)
{
int pi,pj;cin>>pi>>pj;
if(sixseven(pi)==sixseven(pj))
cout<<"Yes\n";
else
cout<<"No\n";
}
}
//sixsevensixsevensixsevensixsevensixsevensixsevensixseven
其中要特别注意这行
return sixseven(fa[x]);
如果你在其他并查集题目发现自己TLE的时候,可以优化
代码如下
return fa[x]=sixsenven(fa[x]);
具体为啥自己理解,背就完了
这里空空如也






有帮助,赞一个