并查集的find()函数中
int find(int x) { //寻找x的祖宗结点
if (p[x] != x)
p[x] = find(p[x]);
return p[x];
}
这里的return p[x]为什么不能改成return x; 不是只有在p[x]==x 的时候才会return吗,为什么改成x会错。
include [HTML_REMOVED]
using namespace std;
const int N = 100010;
int p[N];//存储x的父节点
int find(int x) { //寻找x的祖宗结点
if (p[x] != x)
p[x] = find(p[x]);
return p[x];
}
int main() {
int n, m;
cin >> n >> m;
for(int i=0;i<n;i++)
{
p[i]=i;
}
char order[2];
int a, b;
while (m–) {
scanf(“%s%d%d”, order, &a, &b);
if (order[0] == ‘M’) { //合并
p[find(a)] = find(b);
} else if (order[0] == ‘Q’) {
if (find(a) == find(b))
printf(“Yes\n”);
else
printf(“No\n”);
} else ;
}
return 0;
}
想明白了,在递归回溯的时候,p[x]的值已经变为了x的祖宗结点。所以下面是return p[x]; 只有像下面这样写才可以写成return x; 但是这样没有了优化的过程,会超时。
超时了
谢谢!