Luogu 2661資訊傳遞(並查集)
阿新 • • 發佈:2021-08-24
這個題相信大家都很熟悉了,這裡想說一下有關的一些問題。
#include<cstdio> #include<iostream> using namespace std; int f[200002],d[200002],n,minn,last; int fa(int x) { if (f[x]!=x) { int last=f[x]; f[x]=fa(f[x]); d[x]+=d[last]; } return f[x]; } void check(int a,int b) {int x=fa(a),y=fa(b); if (x!=y) {f[a]=b; d[a]=1;} else minn=min(minn,d[b]+1); return; } int main() { int i,t; scanf("%d",&n); for (i=1;i<=n;i++) f[i]=i; minn=0x7777777; for (i=1;i<=n;i++) { scanf("%d",&t); check(i,t); } printf("%d",minn); return 0; }
這是我認為的並查集的做法,參考了洛谷題解的第一篇,但中間check是不一樣的,也可以AC。但是我對題解check函式的做法無法理解,覺得有背邏輯,但也可能是我太菜了。
至於以上部分是我在洛谷上發表的,目前還沒有人來和我一起討論,如果您有一些想法,可以聯絡我。