#41789: C++詳解-並查集


toseanlin@gmail.com (Dr. SeanXD)

學校 : 康橋雙語學校
編號 : 158065
來源 : [24.147.249.5]
最後登入時間 :
2024-10-08 11:06:51
g598. 4. 真假子圖 -- 2021年11月APCS | From: [50.205.228.2] | 發表日期 : 2024-08-27 19:23

使用並查集的方式來做資料的存儲,當在收 2*M 個 pair 的時候,跑一個函式來更新兩個全域陣列中的資料,兩個陣列分別為 friends 和 enemies,代表每一個人他的隊友和另外一組的人。在程式一開始時可以將兩個陣列從 0 到 N-1 分別預設為 -1。如果進函式時兩個人的 friends 陣列資料都是 -1,代表兩個人都沒有做過判斷,所以就將 friends 設為自己、enemies 設為另外一個人。如果兩個人的 friends 陣列資料都 != -1,代表兩個人都有判斷過,這邊要將兩個人所有的朋友和敵人都分別設置為新的朋友和敵人,下面的程式碼是使用函式的方式去做遞迴將每一個人的朋友、敵人設定為新的人。如果是其中一個人已經有資料另外一個人是 -1,則是將沒有資料的人的 friends 設定為另外一人的敵人的朋友根節點、enemies 設定為另外一個人的朋友根節點。

在判斷新的 pair 是否正確時也需要做資料的判斷,所以可以重新宣告一個 newFriend 和 newEnemy,並將 friends 和 enemies 的資料移過去,收到新的要判斷的 pair 時,要做的事情其實和上面的差不多,只是當兩個人的 newFriend 和 newEnemy 都有做過判斷時就不需要做判斷,跑完函式之後就是判斷 newFriend[a] 是否 == newFriend[b]。

 

範例程式碼

 
ZeroJudge Forum