C 初學記錄(並查集)

2022-06-02 21:45:10 字數 1192 閱讀 9583

並查集

題目

今天是伊格那丟的生日。他邀請了很多朋友。現在該吃晚飯了。伊格那丟想知道他至少需要多少張桌子。你必須注意到並不是所有的朋友都認識對方,而且所有的朋友都不想和陌生人待在一起。這個問題的乙個重要規則是如果我告訴你a認識b, b認識c,這意味著a, b, c互相認識,所以它們可以在乙個表中。例如:如果我告訴你a知道b, b知道c, d知道e,那麼a, b, c可以在乙個表中,d, e必須在另乙個表中。伊格那丟至少需要兩張表。輸入以乙個整數t(1<=t<=25)開始,它表示測試用例的數量。然後是t測試用例。每個測試用例都以兩個整數n和m開始(1<=n,m<=1000)。n表示朋友的數量,朋友的數量從1到n進行標記,然後是m行。每一行由兩個整數a和b(a!=b)組成,這意味著朋友a和朋友b互相認識。兩種情況之間會有一條空行。對於每個測試用例,只輸出ignatius至少需要多少個表。不要列印任何空格。

執行**

#includeusing namespace std;

int pre[1004];//有1000人

int t,n,m;//測試個數,n個人,m對

int finds(int x)//查詢x是誰的friend

void mix(int x,int y)

int main()

int a,b;//表示a,b關係

for(int i=0;i>a>>b;//讀入a,b

mix(a,b);//合併a,b到一棵樹內,代表a,b互相認識

}int ans=0;//結果需要多少張桌子

for(int i=1;i<=n;++i)//對於每乙個人

cout<**理解

如果你的朋友非常多(假如有一萬個),那麼計算需要多少張桌子是不容易的,但是在這時,使用並查集可以更加快速的完成這個計算。首先看**的函式mix部分,mix函式將判斷你輸入的一組資料中是否有重複的人出現,若一組資料沒有重複鍵入相同的資料,則將資料進行執行下乙個函式,finds函式。find函式是對輸入的資料進行關聯的函式。在程式的起始部分,定義了1004個資料空間的陣列,而finds函式是將輸入的兩個資料乙個作為陣列的陣列名乙個作為陣列的元素,接著進行遞迴,即將陣列名下的元素再次作為陣列名進行查詢,若到最後的元素作為陣列名再次查詢時查詢不到下乙個元素即if(pre[x]==x),則進行桌位輸出即桌位數加一。

C 初學記錄(乳酪 並查集)

原題目 牛客網 題目描述 現有一塊 酪,它的高度為 h,它的長度和寬度我們可以認為是無限大的,乳酪中間有許多半徑相同的球形空洞。我們可以在這塊乳酪中建立空間座標系,在座標系中,乳酪的下表面為 z 0,乳酪的上表面為 z h。現在,乳酪的下表面有乙隻小老鼠 jerry,它知道乳酪中所有空洞的球心所在的...

初學並查集 並查集1

現在,我是用乙個初學者的眼光來寫並查集,此文最初寫於我學並查集的那天,後經過多次修改。1 並查集是什麼 並查集是乙個具有多個連通分支的圖,他擁有合併兩個連通分支,和查詢兩個元素是否位於同乙個連通分支的功能。2 並查集的簡單應用 並查集解決什麼問題 假如有一些點,你知道哪些點是直接相連的,但實際上間接...

並查集初學

並查集是一種樹型的資料結構,用於處理一些不相交集合的合併及查詢問題。並查集的思想是用乙個陣列表示了整片森林 parent 樹的根節點唯一標識了乙個集合,我們只要找到了某個元素的的樹根,就能確定它在哪個集合裡。並查集用在一些有 n 個元素的集合應用問題中,我們通常是在開始時讓每個元素構成乙個單元素的集...