灵异事件求助

P1196 [NOI2002] 银河英雄传说

您好,当程序中存在 `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


|