您好,当程序中存在 `UB` 时,程序完全可以出现任何意想不到的行为,这都是符合语言标准的。所以没必要深入研究存在 `UB` 的代码。
任何非空类型返回值的函数都需要填写返回值。
by only_a_speaker @ 2023-10-26 15:37:42
@[Aakkosetsumussa](/user/400468) 您14行的getf会影响后面吧
by Vsinger_洛天依 @ 2023-10-26 15:42:02
```cpp
ll getf(ll x) {
//if(x==fa[x]) return x;
//getf(fa[x]);
d[x]+=d[fa[x]];
//return fa[x]=getf(fa[x]);
}
by Vsinger_洛天依 @ 2023-10-26 15:43:12
你获得没有返回值的merge。能过编就已经是奇迹了……
by Kazeno_Akina @ 2023-10-26 15:51:12
@[only_a_speaker](/user/1154375) @[Vsinger_洛天依](/user/1000298) @[DoraYaoxy](/user/612567)
谢谢,可是我把merge改成void之后还是会出现这种情况
```cpp
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=30005;
ll T, x, y;
char opt;
ll fa[N], d[N], siz[N];
ll getf(ll x) {
if(x==fa[x]) return x;
// ll root=getf(fa[x]);
d[x]+=d[fa[x]];
return fa[x]=getf(fa[x]);
}
void merge(ll x, ll y) {
ll fx=getf(x), fy=getf(y);
d[fx]+=siz[fy];
fa[fx]=fy;
siz[fy]+=siz[fx];
siz[fx]=0;
}
int main() {
cin>>T;
for(ll i=1; i<=30000; i++) {
fa[i]=i;
d[i]=0;
siz[i]=1;
}
while(T--) {
cin>>opt>>x>>y;
ll fx=getf(x), fy=getf(y);
if(opt=='M') merge(fx, fy);
else {
if(fx!=fy) {
printf("-1\n");
continue;
}
printf("%lld\n", abs(d[x]-d[y])-1);
}
}
return 0;
}
```
by Aakkosetsumussa @ 2023-10-26 16:37:49
@[Aakkosetsumussa](/user/400468) orz您把root那行改成
```cpp
getf(fa[x])
```
by Vsinger_洛天依 @ 2023-10-26 16:39:59
@[Aakkosetsumussa](/user/400468) $d$数组是全局变量,在getf(fa[x])被修改了啊
by Vsinger_洛天依 @ 2023-10-26 16:40:51
@[Vsinger_洛天依](/user/1000298)
哦哦应该确实是这样,懂了
谢谢,此贴结
by Aakkosetsumussa @ 2023-10-26 16:42:12