洛谷T160512 G 森林(並查集)

2021-10-13 02:57:55 字數 1419 閱讀 6614

題目思路:

按照正常的並查集思路來想的話,對於操作一 **成兩顆樹後,比較難維護的是其中一顆子樹的所有子節點的祖先節點 因為 在find找祖先節點的時候會找到**前的的那個祖先節點,如果給每個子節點都更改的話,複雜度不允許

但是,如果我們把刪邊變為加邊的話,這個並查集維護起來就比較方便了 ,我們從這顆樹的最終狀態向前操作

操作一刪邊變為加邊

操作二 值的變換,顛倒一下順序(這裡可以用記錄乙個節點的數值變化順序)

int n,m,val[maxn]

,u[maxn]

,v[maxn]

,p[maxn]

,pre[maxn]

,ans[maxn]

,res;

int s[maxn]

,vis[maxn]

,op[maxn]

,x[maxn]

,y[maxn]

;stack<

int>q[maxn]

;int

find

(int x)

void

combine

(int x,

int y)

intmain()

for(

int i=

1; i<=n-

1; i++

) u[i]

=read()

,v[i]

=read()

;for

(int i=

1; i<=m ; i++

)for

(int i=

1; i<=n ; i++

) s[i]

= val[i]

= q[i]

.top()

,q[i]

.pop()

;for

(int i=

1; i<=n-

1; i++

)for

(int i=m ; i>=

1; i--

)else

if(op[i]==2

)else

if(op[i]==3

) ans[

++res]

= s[

find

(x[i])]

;}dep(i,res,1)

printf

("%d\n"

,ans[i]);

return0;

}

並查集(模板) 洛谷3367

題目描述 如題,現在有乙個並查集,你需要完成合併和查詢操作。輸入輸出格式 輸入格式 第一行包含兩個整數n m,表示共有n個元素和m個操作。接下來m行,每行包含三個整數zi xi yi 當zi 1時,將xi與yi所在的集合合併 當zi 2時,輸出xi與yi是否在同一集合內,是的話輸出y 否則話輸出n ...

洛谷 3367 模板 並查集

題目描述 如題,現在有乙個並查集,你需要完成合併和查詢操作。輸入格式 第一行包含兩個整數n m,表示共有n個元素和m個操作。接下來m行,每行包含三個整數zi xi yi 當zi 1時,將xi與yi所在的集合合併 當zi 2時,輸出xi與yi是否在同一集合內,是的話輸出y 否則話輸出n 輸出格式 如上...

親戚 洛谷 簡單並查集

題目背景 若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,現在給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。題目描述 規定 x和y是親戚,y和z是親戚,那麼x和z也是親戚。如果x,y是親戚,那麼x的親戚都是y的親戚,y的親戚也都是x的親戚。輸入格式 第一行 三個整數n,m,p...